前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql前缀索引及其选择「建议收藏」

mysql前缀索引及其选择「建议收藏」

作者头像
全栈程序员站长
发布2022-08-31 19:26:49
7210
发布2022-08-31 19:26:49
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

代码语言:javascript
复制
索引的选择性:
    是指不重复的索引值(也称基数)和数据表的记录总数(#T)的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

为了保证前缀索引有较高的选择性,同时又不能太长可以使用计算完整列的选择性,并使前缀的索引性接近于完整列的选择性,方法如下:

第一步:计算完整列的选择性:

表名:city_demo, city是城市名称字段

代码语言:javascript
复制
mysql>SELECT COUNT(DISTINCT `city`)/COUNT(*) FROM `city_demo`;

显示结果:

代码语言:javascript
复制
+---------------------------------+
| COUNT(DISTINCT `city`)/COUNT(*) | +-----------------+----------+-----
| 0.0312| +---------------------------------+

也就是说前缀索引的选择性能够接近0.031,那么该长度的索引就可以用了。

第二步:计算不同前缀长度的选择性
代码语言:javascript
复制
mysql> SELECT COUNT(DISTINCT LEFT(`city`,3))/COUNT(*) AS sel3, mysql> COUNT(DISTINCT LEFT(`city`,4))/COUNT(*) AS sel4,
mysql> COUNT(DISTINCT LEFT(`city`,5))/COUNT(*) AS sel5, mysql> COUNT(DISTINCT LEFT(`city`,6))/COUNT(*) AS sel6,
mysql> COUNT(DISTINCT LEFT(`city`,7))/COUNT(*) AS sel7 mysql> FROM `city_demo`;

显示结果:

代码语言:javascript
复制
+-------+-------+-------+-------+-------+
| sel3 | sel4 | sel5 | sel6 | sel7 | +-------+-------+-------+-------+-------+
| 0.239 |0.0293 |0.0305 |0.0309 |0.0310 | +-------+-------+-------+-------+-------+

查询结果显示当前缀长度达7的时候,前缀长度的选择性接近完整列的选择性,再增加前缀长度,选择性提升的幅度已经很小了。

第三步:创建前缀索引
代码语言:javascript
复制
mysql> ALTER TABLE `city_demo` ADD KEY(city(7));

其他

前缀索引缺点
代码语言:javascript
复制
MySQL 无法使用前缀索引做ORDER BY 和GROUP BY,也无法使用前缀索引做覆盖扫描
前缀索引扩展
代码语言:javascript
复制
有时候后缀索引也有用途(例如,找到某个域名的所有电子邮件地址)。MySQL原生并不支持反向索引,但是可以把字符串反转存储,并基于此建立前缀索引。可以通过触发器来维护这种索引。

以上内容总结自《高性能MYSQL》5.3.2

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142396.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一步:计算完整列的选择性:
  • 第二步:计算不同前缀长度的选择性
  • 第三步:创建前缀索引
  • 其他
    • 前缀索引缺点
      • 前缀索引扩展
      • 以上内容总结自《高性能MYSQL》5.3.2
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档