《Mysql - 字符串索引应该如何建立?》
一:概述
- 我有一个需求是需要邮箱登录的,
- mysql> select f1, f2 from SUser where email='xxx';
- 我们知道,如果不在 email 上建立索引,那么将会走全表扫描。
- 于是,我们有两种建立方式
- mysql> alter table SUser add index index1(email); // 普通索引
- mysql> alter table SUser add index index2(email(6)); // 前缀索引
二:普通索引和前缀索引的区别?
- 我们看看,他们建立的索引树有什么不同
-
- 从图中你可以看到
- 由于 email(6) 这个索引结构中每个邮箱字段都只取前 6 个字节(即:zhangs),所以占用的空间会更小,这就是使用前缀索引的优势。
三:普通索引和前缀索引查询流程的不同?
- 举例
- select id,name,email from SUser where email='zhangssxyz@xxx.com';
- 普通索引
- 从索引树找到满足索引值是 'zhangssxyz@xxx.com' 的这条记录,取得 ID2 的值;
- 到主键上查到主键值是 ID2 的行,判断 email 的值是正确的,将这行记录加入结果集;
- 取索引树上刚刚查到的位置的下一条记录,发现已经不满足 email='zhangssxyz@xxx.com'的条件了,循环结束。
- 这个过程中,只需要回主键索引取一次数据,所以系统认为只扫描了一行。
- 前缀索引
- 索引树找到满足索引值是 'zhangs' 的记录,找到的第一个是 ID1;
- 到主键上查到主键值是 ID1 的行,判断出 email 的值不是'zhangssxyz@xxx.com',这行记录丢弃;
- 取到刚刚查到的位置的下一条记录,发现仍然是’zhangs‘,取出 ID2,再到 ID 索引上取整行然后判断,这次值对了,将这行记录加入结果集;
- 重复上一步,直到取到的值不是'zhangs'时,循环结束。
- 在这个过程中,要回主键索引取 4 次数据,也就是扫描了 4 行。
- 结论
- 通过这个对比,你很容易就可以发现,使用前缀索引后,可能会导致查询语句读数据的次数变多。
四:区分度
- 通过上面的测试,我们知道,是否会导致查询变多,主要是建立前缀索引的区分度的选择。
- SELECT COUNT(DISTINCT LEFT(column_name, $length)) / COUNT(*) FROM table_name; // 查询区分度
五: 前缀索引对覆盖索引的影响
- 使用前缀索引后,无法在使用覆盖索引,面对查询条件,可能需要回表操作。
六:面对字符串,我们也可以采取其他方式存储
- hash
- bit 位
- 倒序
- 等等
最新文章
- UI控件(UITextField)
- PDF 补丁丁 0.5.0.2520 测试版发布:新春快乐!
- ZOJ 3209 Treasure Map (Dancing Links)
- 自定义Listview
- php 解决json_encode中文问题
- Nmap / NetCat(nc) / 网络安全工具
- MySQL数据库远程访问的权限
- 如何用 Retrofit 2 在安卓上实现 HTTP 访问?
- Codeforces Round #312 (Div. 2) A.Lala Land and Apple Trees
- jquery左右自适应伸缩插件
- 关于Eclipse无法生成class文件的问题
- 【Alpha阶段汇总】成果展示与体验总结
- cocos2d+TexturePackerGUI动画制作
- Codeforces548A:Mike and Fax
- 解决openfire中发送某些特殊字符会断开xmpp连接的问题
- MongoDB 提升性能的18原则(开发设计阶段)
- 【Laravel5.5】 Laravel 在views中加载公共页面怎么实现
- External RNA Controls Consortium (ERCC)
- spring3.2+mybatis3.2+maven整合
- 【FJOI2014】最短路径树问题
热门文章
- polyfit 多项式曲线拟合matlab
- SpringBoot JPA懒加载异常 - com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy
- Apache日志详解
- buoyantSimpleFoam求解器:恒热流壁面【翻译】
- Result window is too large, from + size must be less than or equal to [10000]
- 教你阅读 Cpython 的源码(一)
- qt mvc1
- javaScript(拼写树形)+ajax请求,去后台查找数据
- 中间件 | mq消息队列解说
- MySQL 8.0: From SQL Tables to JSON Documents (and back again)