索引

2019/12/11

索引:类似书的目录,大大加快查询的速度。

数据结构:B+树

注意:索引会占用磁盘空间 创建索引的时候会对表加锁,需要在业务空闲期进行

索引的优缺点:

索引占用空间,减慢 删除、添加、修改效率

索引类型:

主键索引:创建主键会创建主键索引 不允许重复、不允许空值

唯一索引:不允许重复

普通索引:没有限制

全文索引:为大文本对象的列创建索引

全文索引的查询也有自己特殊的语法,而不能使用LIKE %查询字符串%的模糊查询语法

SELECT * FROM table_name MATCH(ft_index) AGAINST('查询字符串');

组合索引:多个列组合构建索引 最左原则,把最常用的放到左边 依次递减

索引方式:

哈希索引:

只有内存 引擎支持哈希索引,通过hash计算出hashcode O(1)不支持范围查找和 和模糊查找排序

hash索引不适用于选择性很差的列上(重复值很多) 姓名 身份证 合适

mysql常用的搜索引擎 myisam innodb

分别实现了非聚类索引 和 聚类索引

聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序

非聚类索引:

非聚簇索引的主索引和辅助索引几乎是一样的,只是主索引不允许重复,不允许空值,他们的叶子结点的key都存储指向键值对应的数据的物理地址

非聚簇索引的数据表和索引表是分开存储的。

聚类索引:

聚簇索引的主索引的叶子结点存储的是键值对应的数据本身,辅助索引的叶子结点存储的是键值对应的数据的主键键值,因此主键的值长度越小越好,类型越简单越好。

聚簇索引的数据和主键索引存储在一起

*使用主索引的时候,更适合使用聚簇索引,因为聚簇索引只需要查找一次,而非聚簇索引在查到数据的地址后,还要进行一次I/O查找数据。

索引使用策略

什么时候要使用索引?

主键自动建立唯一索引;

经常作为查询条件在WHERE或者ORDER BY 语句中出现的列要建立索引;

查询中与其他表关联的字段,外键关系建立索引

高并发条件下倾向组合索引;

用于聚合函数的列可以建立索引,例如使用了max(column_1)或者count(column_1)时的column_1就需要建立索引

索引失效的情况:

在组合索引中不能有列的值为NULL,如果有,那么这一列对组合索引就是无效的。

LIKE操作中,’%aaa%’不会使用索引,也就是索引会失效,但是‘aaa%’可以使用索引。

在索引的列上使用表达式或者函数会使索引失效

在查询条件中使用不等于,包括<符号、>符号和!=会导致索引失效。如果对主键索引或者整数类型的索引使用<符号或者>符号不会使索引失效,如果占总记录的比例很小的话,也不会失效

在查询条件中使用IS NULL或者IS NOT NULL会导致索引失效

字符串不加单引号会导致索引失效

在查询条件中使用OR连接多个条件会导致索引失效,除非OR链接的每个条件都加上索引,这时应该改为两次查询,然后用UNION ALL连接起来。

索引优化

最左原则

带索引的模糊查询优化

在上面已经提到,使用LIKE进行模糊查询的时候,’%aaa%’不会使用索引,也就是索引会失效。如果是这种情况,只能使用全文索引来进行优化(上文有讲到)。

为检索的条件构建全文索引,然后使用

SELECT * FROM tablename MATCH(index_colum) ANGAINST(word);

深入理解MySQL索引原理和实现

Post Directory