【MySQL】索引结构?索引失效的情况?其他相关问题

450 阅读3分钟

数据库中的索引结构?

MySQL底层结构基于B+树,B+树是从B-树改进而来。先讲一下B-树和B+树的区别:

B-树结构和索引情况:

树的高度很浅。 索引和数据一起分布在整棵树中。 数据存储的是数据对应的磁盘地址,k-v结构。 索引元素不重复。 节点索引从左到右递增。 叶子节点之间没有指针。

B+树结构和索引情况:

所有数据保存在叶子节点。 非叶子节点不存数据,只存索引,索引存在冗余,叶子结点包含所有索引。 叶子结点用指针连接,提高范围查找性能。 B+数有两个头指针,一个指向根结点,一个指向关键字索引最小的叶子节点。

包括哪些索引类型

普通索引,唯一索引,主键索引,全文索引,组合索引

创建索引

普通索引

1CREATE INDEX indexName ON table_name (column_name)
2ALTER TABLE tableName ADD INDEX indexName(columnName)
3CREATE TABLE mytable(  
ID INT NOT NULL,   
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
); 

唯一索引

CREATE UNIQUE INDEX indexName ON mytable(username(length)) 
ALTER TABLE mytable ADD UNIQUE [indexName] (username(length))

主键索引 主键作用于列上(可以一个列或多个列联合主键),添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

全文索引 (FULLTEXT)

ALTER TABLE `table_name` ADD FULLTEXT ( `column`)

添加组合索引

ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

使用函数max子类的能找到索引么?

索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。 因此在索引字段做函数操作,索引失效。(后面会讲索引失效的情况)

索引原理是什么?索引失效有哪些情况?

索引利用了B+ 树提供的快速定位能力,树层数少磁盘IO次数少,且同一层兄弟节点的有序性。

1) like 以%开头,索引无效;后缀用%时,索引有效。

2) or语句前后没有同时使用索引。(当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效。)

3) 组合索引,不是使用第一列索引,索引失效。(假如有组合索引(a,b,c),如果a用到索引b用不到索引,c索引自动失效,因为b用不到索引就把c给隔断了。最左原则:创建组合索引时应该将最常用的限制条件放在最左边,依次递减)

4) 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。

5) 在索引列上使用 IS NULL 或 IS NOT NULL操作,索引失效。

6) 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。

7) 在索引字段做函数计算操作。

8) 当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。

三个字段A B C建立组合索引什么时候会出现找不到索引的情况?

组合索引,不是使用第一列索引,索引失效。

索引的优缺点?

优点:

1)通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性。

2)可以加快数据的检索速度

3)可以加速表与表之间的连接

4)在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间

缺点:

1) 创建索引要耗费时间,数据量越大耗时越大。

2) 增删改索引,都需要动态维护,降低表的增删改的效率,数据量越大耗时越大。

3)索引需要占用物理空间,数据量越大,占用空间越大