MYSQL索引优化方法

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

相关推荐
明月看潮生12 分钟前
青少年编程与数学 02-007 PostgreSQL数据库应用 11课题、视图的操作
数据库·青少年编程·postgresql·编程与数学
阿猿收手吧!19 分钟前
【Redis】Redis入门以及什么是分布式系统{Redis引入+分布式系统介绍}
数据库·redis·缓存
奈葵22 分钟前
Spring Boot/MVC
java·数据库·spring boot
leegong2311131 分钟前
Oracle、PostgreSQL该学哪一个?
数据库·postgresql·oracle
中东大鹅36 分钟前
MongoDB基本操作
数据库·分布式·mongodb·hbase
夜光小兔纸1 小时前
Oracle 普通用户连接hang住处理方法
运维·数据库·oracle
兩尛3 小时前
订单状态定时处理、来单提醒和客户催单(day10)
java·前端·数据库
web2u3 小时前
MySQL 中如何进行 SQL 调优?
java·数据库·后端·sql·mysql·缓存
Elastic 中国社区官方博客4 小时前
使用 Elasticsearch 导航检索增强生成图表
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小金的学习笔记4 小时前
RedisTemplate和Redisson的使用和区别
数据库·redis·缓存