MySQL 索引类型与数据结构

mysql索引类型与数据结构

在这里插入图片描述

①什么是索引

索引是供服务器快速在表中查询一行数据的数据库结构,默认是 B+Tree 结构

索引适合在 高基数列 ( 不相同的值多的列 ), 或者数据量很大的列上添加

索引列不能经常变换(增删改) , 维护索引需要花费时间

②索引类型
  • 普通索引 index

    最基本的索引没有任何限制

    01  –直接创建索引
    02  CREATE INDEX index_name ON table(column(length))
    
    03  –修改表结构的方式添加索引
    04  ALTER TABLE table_name ADD INDEX index_name ON (column(length))
    
    05  –创建表的时候同时创建索引
    06  CREATE TABLE `table` (
    07      `id` int(11) NOT NULL AUTO_INCREMENT ,
    08      `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    09      `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
    10      `time` int(10) NULL DEFAULT NULL ,
    11       PRIMARY KEY (`id`),
    12       INDEX index_name (title(length))
    13  )
    14  –删除索引
    15  DROP INDEX index_name ON table
    
  • 唯一索引 UNIQUE

    与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)

    01  –创建唯一索引
    02  CREATE UNIQUE INDEX indexName ON table(column(length))
    
    03  –修改表结构
    04  ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
    
    05  –创建表的时候直接指定
    06  CREATE TABLE `table` (
    07      `id` int(11) NOT NULL AUTO_INCREMENT ,
    08      `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    09      `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
    10      `time` int(10) NULL DEFAULT NULL ,
    11      PRIMARY KEY (`id`),
    12      UNIQUE indexName (title(length))
    13  );
    
  • 全文索引 FULLTEXT

    全文检索快

    01  –创建表的适合添加全文索引
    02  CREATE TABLE `table` (
    03    `id` int(11) NOT NULL AUTO_INCREMENT ,
    04    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    05    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
    06    `time` int(10) NULL DEFAULT NULL ,
    07    PRIMARY KEY (`id`),
    08    FULLTEXT (content)
    09  );
    
    10  –修改表结构添加全文索引
    11  ALTER TABLE article ADD FULLTEXT index_content(content)
    
    12  –直接创建索引
    13  CREATE FULLTEXT INDEX index_content ON article(content)
    
  • 单列索引,多列索引

    多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引

  • 组合索引

    例如表中针对 title 和 time 建立一个组合索引:

    ALTER TABLE article ADD INDEX index_title_time (title(50),time(10))

    建立这样的组合索引,其实是相当于分别建立了两组组合索引

③索引的数据结构

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构

数据库主要是查询, 设计者为提升速度 从算法角度进行优化, 但是不同算法适用于不同数据结构

  1. 顺序查找 数据量很大时效率极其低下
  2. 二分查找 要求被检索文件有序
  3. 二叉树查找 只能应用于二叉树上

但是数据本身的组织结构不可能完全满足各种数据结构

所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引.

常用索引数据结构

  • B - Tree
  • B + Tree

问题: 红黑树等数据结构也可实现索引,但是文件系统及数据库系统普遍采用B-/+Tree作为索引结构?

  • 一般来说, 索引文件也很大, 不能完全存在内存中, 往往以索引文件方式存储在磁盘中
  • 故, 查询会产生 I/O 消耗, 评价索引优劣的重要指标是查找过程中磁盘I/O操作次数的渐进复杂度
  • 故, 索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数

B-Tree中一次检索最多需要h-1次 I/O(根节点常驻内存),渐进复杂度为(O(h)=O(log_dN))

红黑树的I/O渐进复杂度也为O(h),效率就明显比B-Tree差很多

④MySQL索引实现

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的

MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)

这块内容已经涉及本人能力边界, 需要补充新知识 再来进一步探索

参考网站: https://blog.codinglabs.org/articles/theory-of-mysql-index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值