👏作者简介:大家好,我是小周同志,25届双非校招生Java选手,很高兴认识大家
📕学习出处:本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
有什么优化索引的方法?
前缀索引优化
就是使用 某个字段中字符串的前几个字符 建立索引
-
为什么需要前缀来建立索引呢?
-
为了减小索引字段大小,可以增加一个索引页中存储的索引值,有效提高索引的查询速度。
-
在一些大字符串的字段作为索引时,使用前缀索引可以帮助我们减小索引项的大小。
-
-
前缀索引的局限性:
-
order by 就无法使用前缀索引
-
无法把前缀索引用作覆盖索引
-
覆盖索引优化
覆盖索引就是只需要 二级索引的b+树 就能得到需要查询的数据,而不需要 主键索引的b+树,减少了回表操作
-
比如
select id where name = 'aaa';
其中主键索引id,name是二级索引。- 这里会用到 覆盖索引,因为二级索引b+树的叶子节点就是主键索引的id。因为查询只需要查询id所以就减少了回表操作,不需要再回表到主键索引通过的b+树去查询数据了。
主键索引最好是自增的
-
如果主键索引是自增的:
- 那么每次插入的新数据就会按顺序添加到当前索引节点的位置,不需要移动已有的数据,当页面写满,就会自动开辟一个新页面。因为每次插入一条新记录,都是追加操作,不需要重新移动数据,因此这种插入数据的方法效率非常高。
-
如果我们使用非自增主键:
- 由于每次插入主键的索引值都是随机的,因此每次插入新的数据时,就可能会插入到现有数据页中间的某个位置,这将不得不移动其它数据来满足新数据的插入,甚至需要从一个页面复制数据到另外一个页面,我们通常将这种情况称为 页分裂 。页分裂还有可能会造成大量的内存碎片,导致索引结构不紧凑,从而影响查询效率。(因为一个数据页只能存16KB)
因此,在使用 InnoDB 存储引擎时,如果没有特别的业务需求,建议使用自增字段作为主键。
另外,主键字段的长度不要太大,因为主键字段长度越小,意味着二级索引的叶子节点越小(二级索引的叶子节点存放的数据是主键值),这样二级索引占用的空间也就越小。
索引最好设置为 NOT NULL
为了更好的利用索引,索引列要设置为 NOT NULL 约束。有两个原因:
-
原因一:索引值为NULL,会使优化器在做索引选择时更加复杂,更加难以优化。比如进行索引统计时,count 会省略值为NULL的行。
-
原因二:NULL是个没意义的值,会占用物理空间。因为 InnoDB 存储记录时,如果表中存在允许为NULL的字段,那么行格式中 至少会用 1字节空间存储NULL值列表。
防止索引失效
用上了索引并不意味着查询的时候用上了索引。有些情况会导致索引失效。
生索引失效的情况:
-
当我们使用左或者左右模糊匹配的时候,也就是
like %xx
或者like %xx%
这两种方式都会造成索引失效; -
当我们在查询条件中对索引列做了计算、函数、类型转换操作,这些情况下都会造成索引失效;
-
联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
-
在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。