MySQL数据库原理学习(十六)
2023-06-13 09:13:59 时间
2.6.7 前缀索引
当字段类型为字符串(varchar,text,longtext等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO, 影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。
1). 语法
create index idx_xxxx on table_name(column(n)) ;
示例:
为tb_user表的email字段,建立长度为5的前缀索引。
create index idx_email_5 on tb_user(email(5));
2). 前缀长度
可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高, 唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
select count(distinct email) / count(*) from tb_user ;
select count(distinct substring(email,1,5)) / count(*) from tb_user ;
3). 前缀索引的查询流程
2.6.8 单列索引与联合索引
单列索引:即一个索引只包含单个列。
联合索引:即一个索引包含了多个列。
我们先来看看 tb_user 表中目前的索引情况:
在查询出来的索引中,既有单列索引,又有联合索引。
接下来,我们来执行一条SQL语句,看看其执行计划:
通过上述执行计划我们可以看出来,在and连接的两个字段 phone、name上都是有单列索引的,但是最终mysql只会选择一个索引,也就是说,只能走一个字段的索引,此时是会回表查询的。
紧接着,我们再来创建一个phone和name字段的联合索引来查询一下执行计划。
create unique index idx_user_phone_name on tb_user(phone,name);
此时,查询时,就走了联合索引,而在联合索引中包含 phone、name的信息,在叶子节点下挂的是对应的主键id,所以查询是无需回表查询的。
如果查询使用的是联合索引,具体的结构示意图如下:
相关文章
- MySQL数据库原理学习(五十一)
- 排空数据库MySQL中排空数据库的快速查看技巧(查看mysql)
- MySQL学习之路:借助百度文库登峰造极(mysql百度文库)
- 和使用学习MySQL函数:从创建到使用(mysql函数的创建)
- MySQL中删除主键约束: 数据库必知必会(删除主键约束mysql)
- MySQL实现自增字段的简单指南(mysql创建自增字段)
- MySQL实现获取每月第一天(mysql获取第一天)
- 使用MySQL数据库的UUID主键(mysql主键uuid)
- MySQL获取日期:一步一步学习(mysql获取日期)
- MySQL实现汉字拼音排序功能(mysql汉字拼音排序)
- 如何优化MySQL数据库的读写速度?(mysql数据库读写速度)
- MySQL数据库:一键完成批量修改(mysql数据库批量修改)
- MySQL数据库模式优化实践(mysql 数据库模式)
- MySQL循环操作:从数据库获取最大效率(mysql 循环 数据库)
- 让MySQL数据库设计更便捷——文档指南(mysql数据库设计文档)
- MySQL事务操作保证数据的一致性与完整性(mysql中事务操作)
- MySQL中buffer的作用及优化方法(mysql中buffer)
- MySQL的两阶段提交原理解析(mysql两阶段提交原理)
- CEF与MySQL联手突破性能极限(c ef与mysql)
- MySQL索引简介及创建方法(mysql一般索引创建)
- 使用MySQL实现无需交互的数据操作(mysql 不交互)
- MySQL实现两个字段的比较方法(mysql两字段比较)