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

mysql前缀索引及其选择「建议收藏」有时候需要索引很长的字符列,比如BLOB、TEXT或者很长的VARCHAR类型的列,通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。

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

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

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

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

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

mysql>SELECT COUNT(DISTINCT `city`)/COUNT(*) FROM `city_demo`;

显示结果:

+---------------------------------+
| COUNT(DISTINCT `city`)/COUNT(*) | +-----------------+----------+-----
| 0.0312| +---------------------------------+

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

第二步:计算不同前缀长度的选择性

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`;

显示结果:

+-------+-------+-------+-------+-------+
| sel3 | sel4 | sel5 | sel6 | sel7 | +-------+-------+-------+-------+-------+
| 0.239 |0.0293 |0.0305 |0.0309 |0.0310 | +-------+-------+-------+-------+-------+

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

第三步:创建前缀索引

mysql> ALTER TABLE `city_demo` ADD KEY(city(7));

其他

前缀索引缺点

MySQL 无法使用前缀索引做ORDER BY 和GROUP BY,也无法使用前缀索引做覆盖扫描

前缀索引扩展

有时候后缀索引也有用途(例如,找到某个域名的所有电子邮件地址)。MySQL原生并不支持反向索引,但是可以把字符串反转存储,并基于此建立前缀索引。可以通过触发器来维护这种索引。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年5月23日 下午9:20
下一篇 2022年5月23日 下午9:40


相关推荐

  • 思科和华为交换机命令的区别(思科交换机和华为交换机的异同)

    思科和华为交换机常用命令对比一、调试命令思科:Switch#showrun显示所有配置命令Switch#showipinterbrief显示所有接口状态Switch#showvlanbrief显示所有VLAN的信息Switch#showversion显示版本信息华为:[Quidway]discur显示所有配置命令[Quidway…

    2022年4月16日
    78
  • 三角形余弦定理

    三角形余弦定理

    2026年3月20日
    2
  • 一篇文章,Vue快速入门!!!

    一篇文章,Vue快速入门!!!①Vue概述及第一个Vue程序(HelloWorld)1.1什么是MVVMMVVM(Model-View-ViewModel)是一种软件设计模式,由微软WPF(用于替代WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight(类似于JavaApplet,简单点说就是在浏览器上运行WPF)的架构师KenCooper和TedPeters开发,是一种简化用户界面的事件驱动编程方式。由JohnGossman(同样也是WPF和Sliverlight的架构师)与2005年在他的

    2022年5月4日
    55
  • mysql longtext问题

    mysql longtext问题各位大神们,我把数据库中content的类型设置成了text了,然后我像里面插入数据,为什么我用select查询去没有结果只显示blob具体的如图所示1234

    2022年5月15日
    52
  • HashMap扩容后,元素是如何重新分布的

    HashMap扩容后,元素是如何重新分布的上文回顾在上文深入源码分析 HashMap 到底是怎样将元素 put 进去的我们着重分析了无参构造函数是如何创建 map 对象和 HashMap 是如何将第一个元素 put 进 table 的 此篇重点这篇我们将逐行代码分析 1 有参构造函数是如何创建 map 对象的 2 当元素增多导致扩容之后 元素是如何重新分布的同样 为了方便读者复盘 我截取源码是尽量将行号带上 jdk 版本还是 1 8 结构图再重复一遍 HashMap 的底层数据结构为数组 链表 红黑树的结构 放一个 HashMap 的结构示意图 有个大致印象 解剖思路

    2026年3月16日
    3
  • PyCharm 界面设置

    PyCharm 界面设置点击设置设置字体大小界面设置快捷键设置 Ctrl 那个键 esc 下面的键

    2026年3月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号