MYSQL索引优化方法

发布于:2024-04-15 ⋅ 阅读:(89) ⋅ 点赞:(0)

👏作者简介:大家好,我是小周同志,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 后的条件列不是索引列,那么索引会失效。