加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL索引道理与应用:索引范例,存储布局与锁

发布时间:2019-06-04 14:50:47 所属栏目:编程 来源:王下邀月熊_Chevalier
导读:在数据布局与算法--索引 https://url.wx-coder.cn/O07eI 一节中,我们接头了 B+Tree, LSM-Tree 这样的文件索引以及全文索引的基本算法,本文则会针对文件索引在相关型数据库中的现实应用举办切磋。 索引(Index)是辅佐数据库体系高效获取数据的数据布局,

行使索引对功效举办排序,必要索引的次序和 ORDER BY 子句中的次序同等,而且全部列的起落序同等(ASC/DESC)。假如查询毗连了多个表,只有在 ORDER BY 的列引用的是第一个表才可以(必要按序 JOIN)。

  1. # 行使索引排序  
  2. ORDER BY A - 最左前缀匹配  
  3. WHERE A=5 ORDER BY B,C - 最左前缀匹配  
  4. WHERE A=5 ORDER BY B DESC - 最左前缀匹配  
  5. WHERE A>5 ORDER BY A,B - 最左前缀匹配  
  6. # 不能行使索引排序  
  7. WHERE A=5 ORDER BY B DESC,C ASC - 起落序纷歧致  
  8. WHERE A=5 ORDER BY B,D - D 不在索引中  
  9. WHERE A=5 ORDER BY C - 没有包括最左前缀  
  10. WHERE A>5 ORDER BY B,C - 第一列是范畴前提,无法行使 BC 排序  
  11. WHERE A=5 AND B IN(1, 2) ORDER BY C - B 也是范畴前提,无法用 C 排序  

like 前缀

对付 like 前缀,其是指在行使 like 查询时,假如行使的表达式为 first_name like 'rMq%';那么其是可以用到 first_name 字段的索引的。可是对付 first_name like '%Chu%';,其就无法行使 first_name 的索引。对付 like 前缀,MySQL 底层现实上是行使了一个补全计策来行使索引的,好比这里 first_name like 'rMq%';,MySQL 会将其补全为两条数据:rMqAAAAA 和 rMqzzzzz,后头补所有门的长度为当前字段的最大长度。在行使索引查询时,MySQL 就行使这两条数据举办索引定位,最后必要的功效集就是这两个定位点的中间部门的数据。如下是行使 like 前缀的一个表示图:

MySQL索引道理与应用:索引范例,存储布局与锁

字符串前缀

字符串前缀索引指的是只取字符串前几个字符成立的索引。在举办查询时,假如一个字段值较长,那么为其成立索引的本钱将很是高,而且查询服从也较量低,字符串前缀索引就是为了办理这一题目而存在的。字符串前缀索引首要应用在两个方面:

  • 字段前缀部门的选择性较量高;
  • 字段整体的选择性不太大(假如字段整体选择性较量大则可以行使哈希索引)。

譬如为 first_name 字段成立了长度为 4 的前缀索引,可以看到,假如查询行使的是 where first_name='qWhNIZqxcbD';,那么 MySQL 起首会截取等值前提的前四个字符,然后将其与字符串前缀索引举办较量,从而定位到前缀为"qWhN"的索引片,然后获取该索引片对应的磁盘数据,最后将获取的磁盘数据的 first_name 字段与查询的等值前提的值举办较量,从而获得功效集。

字符串前缀索引最必要留意的一个题目是怎样选择前缀的长度,长度选择合当令,前缀索引的过滤性将和对整个字段成立索引的选择性险些相称。这里我们就必要用到前面讲授的关于字段选择性的观念,即字段选择性为对该字段分组之后,数据量最大的组的数据量占总数据量的比例。这里选择前缀长度时,可以领略为,前缀的选择性为凭证前缀分组之后,数据量最大的组占总数据量的比例。如下表所示为计较前缀长度的 SQL 公式:

  1. select count(*) as cnt, first_name as perf from actor group by perf ORDER BY cnt desc limit 10;    -- 0  
  2. select count(*) as cnt, left(first_name, 2) as perf from actor group by perf ORDER BY cnt desc limit 10;    -- 2  
  3. select count(*) as cnt, left(first_name, 3) as perf from actor group by perf ORDER BY cnt desc limit 10;    -- 3  
  4. select count(*) as cnt, left(first_name, 4) as perf from actor group by perf ORDER BY cnt desc limit 10;    -- 4  

其他索引

包围索引

包围索引指的是对付查询中行使的撤除参加索引过滤扫描的全部字段将其插手到该查询所行使的索引尾部的索引。包围索引扫描的利益在于因为查询中所行使的全部字段都在统一索引的字段,因而在举办查询时只必要在索引中获取相干数据即可,而不必要回磁盘扫描响应的数据,从而停止了查询中最耗时的磁盘 I/O 读取。对付如下查询:

  1. select a, b, c from t where a='a' and b='b'; 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读