mysql 索引

什么是索引?有什么作用?

索引:是一种用于快速查询和检索数据的的数据结构。
作用:减少检索数据,加快查询速度。
*常见的索引: B树,B+树和Hash。

索引的优缺点?

优点:使用索引可以减少数据检索量,加大数据检索速度,这也是使用索引的主要作用。还可以通过创建唯一索引保证数据的唯一性。
缺点:数据的增删改也需要维护索引,降低sql执行速度。索引也会使用物理文件存储,占用物理空间。

使用索引一定能提高查询性能吗?

大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。

索引的数据结构?

hash:可以快速查找,但是有hash冲突,以及不能支持顺序查找和范围查找。
B树、B+树:又称为多路平衡树,B+树是B树的一种变体。

B树、B+树的异同?

  • B树所有节点既存放键(key),又存放数据(data)。B+树只在叶子节点上存储键(key)和数据(data)。其他节点上存储键(key)。
  • B树叶子节点是相互独立的,而B+树的叶子节点有一条引用链指向相邻的叶子节点。
  • B树查询相当于二分查询,有可能在中间某个节点检索就完成了。而B+树查询很稳定,任何查询都是从根到叶子节点的过程,而且叶子节点的顺序检索很明显。

MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree,两者使用的不同点?
MyISAM的索引文件和数据文件是分离的,索引文件B+Tree的叶子节点的data域是存的数据所在的地址,当从主索引获取到数据地址后,再去获取数据。

InnoDB是将整个数据文件组织成一个B+Tree,主索引的叶子节点的data域直接存放数据(聚簇索引),当检索到数据后,直接从data域取出数据返回。辅助索引的data域存放的是数据的主键,辅助索引检索到数据后,再走一次主索引查询数据。因此创建表时,不建议主键的字段过长,且不单调,这样容易造成索引分裂。

索引类型?

主键索引:数据表的主键列使用的就是主键索引,一张数据表有只能有一个主键,并且主键不能为 null,不能重复。 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是否有唯一索引的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个 6 byte 的自增主键。
二级索引:二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。

二级索引类型?

唯一索引(Unique Key) :唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
普通索引(Index) :普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
前缀索引(Prefix) :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。
全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。

聚集索引与非聚集索引?

聚集索引:聚集索引即索引结构和数据一起存放的索引,InnoDB的主键索引属于聚集索引。

  • 优点:聚集索引的查询速度非常的快,因为整个 B+树本身就是一颗多叉平衡树,叶子节点也都是有序的,定位到索引的节点,就相当于定位到了数据.
  • 缺点:
    • 依赖于有序的数据 :因为 B+树是多路平衡树,如果索引的数据不是有序的,那么就需要在插入时排序,如果数据是整型还好,否则类似于字符串或 UUID 这种又长又难比较的数据,插入或查找的速度肯定比较慢。
    • 更新代价大 : 如果对索引列的数据被修改时,那么对应的索引也将会被修改, 而且况聚集索引的叶子节点还存放着数据,修改代价肯定是较大的, 所以对于主键索引来说,主键一般都是不可被修改的。

非聚集索引:非聚集索引即索引结构和数据分开存放的索引,二级索引属于非聚集索引。

  • 优点:更新代价比聚集索引要小 。非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据。
  • 缺点:
    • 依赖于有序的数据 :跟聚集索引一样,非聚集索引也依赖于有序的数据。
    • 可能会二次查询(回表):这应该是非聚集索引最大的缺点了。 当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。

非聚集索引一定回表查询吗(索引覆盖)?

索引覆盖即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了, 而无需回表查询。

创建索引的注意事项?

  1. 选择合适的字段创建索引:
    1. 不为 NULL 的字段
    2. 频繁查询的字段
    3. 频繁排序的字段
    4. 频繁用于连接的字段
    5. 频繁作为条件查询的字段
    6. 不被频繁更新的字段
  2. 尽可能的考虑建立联合索引
  3. 避免冗余索引
  4. 考虑在字符串类型的字段上使用前缀索引代替普通索引

MySQL 如何为表字段添加索引?

ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容