前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「Mysql索引原理(四)」单列索引

「Mysql索引原理(四)」单列索引

作者头像
源码之路
发布2020-09-04 10:11:20
7550
发布2020-09-04 10:11:20
举报
文章被收录于专栏:源码之路源码之路

单列索引

独立的列

例如,select actor_id from actor where actor_id+1=5;

这个查询无法使用actor_id列的索引。

下面是另一个常见的错误:

select ... where TO_DATS(CURRENT_DATA) - TO_DAYS(date_col ) <=10;

列不能是函数的一部分。

前缀索引和索引选择性

  1. 索引的选择性:不重复的索引值(也称为基数)和数据表的记录总数(#T)的比值,范围从1/T到1之间。选择性越高则查询效率越高,因为选择性高的索引可以让Mysql在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
  2. 对于BLOB、TEXT或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度。
  3. 前缀的“基数”应该接近于完整列的“基数”。

如何选取适合的前缀长度?

1.创建模拟数据 数据分布不是真实分布,对练习来说并不重要。我们以城市出现的次数决定该城市的常见与否,出现次数最多表示该城市最常见。 2.找到最常见的

代码语言:javascript
复制
select  count(*)  as cnt,city from city_demo group by city order by cnt desc;

3.查找最频繁出现的城市前缀,先从1个前缀字幕开始:

代码语言:javascript
复制
select  count(*)  as cnt , left(city,1) as pref  from city_demo group by pref  order by cnt desc ;

每个前缀都比原来的城市出现的次数更多,因此唯一前缀比唯一城市要少

4.增加前缀长度

直到这个前缀的选择性接近完整列的选择性。

两个前缀:

三个前缀:

四个前缀:

发现前缀为3的时候,选择性最接近完整列,所以说以列的前三个字符来做索引是最合适的。索引体积小且查询速度快。

选取前缀的另一个办法

计算合适的前缀长度的另一个办法就是计算完整列的选择性,并使前缀的选择性接近于完整列的选择性。

如:

代码语言:javascript
复制
 select count(distinct city)/count(*) from city_demo

完整列的选择性是0.15,可以在一个查询中针对不同前缀长度进行计算

代码语言:javascript
复制
select count(distinct city)/count(*) as orginal,

 count(distinct left(city,1))/count(*) as sel1,

 count(distinct left(city,2))/count(*) as sel2,

 count(distinct left(city,3))/count(*) as sel3,

 count(distinct left(city,4))/count(*) as sel4,

 count(distinct left(city,5))/count(*) as sel5

from city_demo

前缀为3的时候最接近完整列的选择性,再增加前缀长度,选择性提升的幅度已经很小了。

如何创建前缀索引

alter table city_demo add key (city(3));

前缀索引是一种能使索引更小、更快的有效办法,但另一方面也有缺点:mysql无法使用前缀索引做order by和group by,也无法使用前缀索引做覆盖扫描。

应用场景

存储网站会话时,需要在一个很长的十六进制字符串上创建索引。此时如果采用长度为8的前缀索引通常能显著地提升性能,且对上层应用完全透明。

后缀索引

字符串反转后做前缀索引

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单列索引
    • 独立的列
      • 前缀索引和索引选择性
        • 如何选取适合的前缀长度?
        • 选取前缀的另一个办法
        • 如何创建前缀索引
        • 应用场景
        • 后缀索引
    相关产品与服务
    云数据库 MySQL
    腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档