[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[转帖]Mysql前缀索引

上一篇:[备忘]mysql的in查询优化是有点弱爆了~
下一篇:[转帖]选择性低的列上建索引,呵呵

添加日期:2016/5/13 12:09:57 快速返回   返回列表 阅读2175次
应用场景:
数据库里有个地址(address)字段,类型为varchar(100),业务决定了要经常根据address来进行查询。
确定选择性:


SELECT count(DISTINCT(address))/count(*) AS Selectivity FROM info;   


+-------------+    
| Selectivity |   
+-------------+    
|      0.8745 |   
+-------------+   
<address>选择性很好,但是长度为100,对整个字段建立索引显然不合适,可以考虑建立前缀索引,例如<left(address,5)>,看看其选择性:  


SELECT count(DISTINCT(left(address,5)))/count(*) AS Selectivity FROM info; 

  
+-------------+    
| Selectivity |   
+-------------+    
|      0.5981 |   
+-------------+    
选择性还不错,但和0.8745相比还是太低,所以我们可以将前缀长度增加到10,再看看选择性:


SELECT count(DISTINCT(left(address,10)))/count(*) AS Selectivity FROM info;

   
+-------------+    
| Selectivity |   
+-------------+    
|      0.8239 |   
+-------------+   
和0.8745已经很接近了,但是索引长度只有10,所以就可以决定建立前缀索引了。
前缀索引兼顾索引大小和查询速度,但是其缺点是不能用于ORDER BY和GROUP BY操作,也不能用于Covering index(即当索引本身包含查询所需全部数据时,不再访问数据文件本身)。
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved