mysql前缀索引及其选择

索引的选择性:
    是指不重复的索引值(也称基数)和数据表的记录总数(#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值