• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

高效利用mysql索引指南

mysql 搞代码 4年前 (2022-01-09) 13次浏览 已收录 0个评论

前言

mysql 相信大部分人都用过,索引肯定也是用过的,但是你知道如何创建恰当的索引吗?在数据量小的时候,不合适的索引对性能并不会有太大的影响,但是当数据逐渐增大时,性能便会急剧的下降。

本篇是对 mysql 索引的一个归纳总结,如果有错误的地方,记得评论指出哦。

索引基础
  我们都有都知道查字典的步骤,是先在索引页中找到这个字的页码,然后再到对应的页码中查看这个字的信息。mysql 的索引方法也是和这个类似的,先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。假如有下面的 sql 语句:

1
select * from student where code=’2333′
加入 code 列上建立有索引,mysql 将使用该索引找到值为’2333’的数据行,然后读取数据行的所有数据返回。

索引类型
B-Tree 索引
  (不是 B 减树,就是 B 树),绝大多数的索引类型都是 B-Tree 的(或者是 B-Tree 的变体),通常我们使用的也是这类索引。Mysql 中 MyISAM 存储引擎使用的是 B-tree,InnoDB 使用的是 B+Tree,B 树和 B+树的区别自行百度。

  树结构的索引能够加快访问数据的速度,存储引擎不再需要全表扫描来获取所需的数据,取而代之的是从树的根节点来进行二分搜索,总所周知二分搜索的速度是相当快的,因此我们能够利用索引来极大的提高查询速度。B-Tree 支持以下几种类型的查询:

假设再 student 表中仅有:name,age,weight 这样一个多列索引,下面的查询都能利用到此索引

全值匹配

和索引列中的所有列进行匹配。比如查询name=’abc’ and age=12,这里用到了第一列和第二列
匹配最左前列

只是用索引的开头部分,比如查询name=’ggg’只使用索引的第一列,查询name=’ggg’ and age=12是用索引的第一、二列。
匹配列前缀

也可以只匹配某一列的开头部分,比如查询name lik ‘g%’,查询 name 以 g 开头的记录。这里用到了第一列
匹配范围值

可用于匹配范围值,比如查询name > ‘ab本文来源gaodai#ma#com搞*!代#%^码$网!c’ and name < ‘bcd’
精确匹配某一列并范围匹配另外一列

用于匹配多列,比如查询name=’abc’ and age > 12。
总的来看,可以发现 B-Tree 索引适用于根据最左前缀的查找,也就是查询字段字段顺序要和索引字段顺序一样,且以第一个索引字段开头。比如查询name,name and age,name and age and weight都能使用索引,但是查询age,age and name不能使用索引。

哈希索引
  hash 索引基于 hash 表实现,只有精确匹配索引所有列才会生效。MySQL 中只有 Memory 引擎显示支持哈希索引,同时也是其默认索引。

  InnoDB 无法创建 hash 索引,但是它有一个功能叫自适应hash索引,当某些索引值使用非常频繁时,引擎会在内存中基于 B-Tree 索引之上再创建一个 hash 索引,这样就让 B-Tree 索引也有了一点 hash 索引的优点。这个功能是一个完全自动的、内部的行为,也就是无法手动控制或配置。

高性能索引策略
  下面是一些常见的索引策略。

独立的列
  这个很简单,如果查询中的列不是独立,便无法使用索引,比如:

1
select * from student where age+1=12
即使 age 列有索引,上面的查询语句也是无法利用索引的。

前缀索引和索引选择性
  如果需要索引很长的字符串列,直接创建索引,会让索引占用更多的空间且速度较慢。一个优化策略是模拟 hash 索引:给列计算一个 hash 值,并在 hash 值列建立索引。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:高效利用mysql索引指南
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址