Mysql 索引知识点
来源:互联网 发布:有赞源码下载 编辑:程序博客网 时间:2024/06/05 18:46
概述
之前写过一篇Mysql B+树学习,简单的介绍了B+数以及MySql使用B+树的原因,
有了这些基础知识点,对MySql索引的类型以及索引使用的一些技巧,就比较容易理解了。
覆盖索引
创建了一个辅助索引,如果能直接从这个辅助索引文件中获取到数据,而无需去访问聚集索引(自增主键索引)文件的话,那么这中就用到索引覆盖了。
这种的效率是极其高的。
select a from table xxx where b = 2
像上面这个语句,如果只是为列b建立索引,那么执行这个SQL是可以用到索引的,但是由于a列的数据并没有在这个b索引中,索引需要再次访问聚集索引文件。
如果建立(b,a)这样的联合索引,那么这个联合索引文件就会包含了a列和b列的值,这样执行上面的语句,就可以用到索引覆盖了。
联合索引
联合索引就是多列索引,存在的目的是为了提高查询性能。
CREATE TABLE `xxxx` ( `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增', `code` int(10), `age` int(10), PRIMARY KEY (`id`), KEY `code` (`code`)) ENGINE=InnoDB
部分同学会觉得直接使用单列索引即可,为啥非要使用联合索引。其实从我上面举得例子就可以发现,只是使用单列索引的话,虽然也是用到了索引,但是经常会回溯到聚集索引,还是有性能损耗的,尤其是还要加上排序等操作,那就更慢了。这里再举一个例子,分页查询
select id,code from xxxx order by age limit 50000,10;
如果只是在age列建立索引的话,这个SQL查询的效率不高,但是建立(age,code)怎样的联合索引,就无需回溯到聚集索引,便可完成操作。
简单枚举值的列不要建立索引
某个列的值只有0和1,为这种列建立辅助索引就大可不必,因为没任何区分度,比如说按照0来找,从B+数中可以找到一大堆数据,性能差。
索引列不要参与计算
B+数存的是key和数据,如要查询的时候,需要对树中的数据先计算后再比较,代价太大了,也极其的慢,因此索引列使用了函数,压根就无法用到索引,MySql也不支持这样做。
能扩展索引就扩展,尽量别新建
联合索引的好处已经在上面有提到了,如果数据库有a索引,现在b列也需要索引,那么直接建立(a,b)即可。因为像b=11或者b in (11,22)这种查询,
MySql是会优化的,可以用到索引的,可以放心使用。
参考的文章
1、MySQL 覆盖索引
2、MySQL索引原理及慢查询优化
- MySQL索引的知识点
- Mysql 索引知识点精华
- Mysql 索引知识点
- MySql知识点索引_01
- mysql-----查询及索引知识点
- 知识点索引
- 索引知识点
- MySQL知识点摘记——索引基本操作
- 面试知识点6:MySQL中InnoDB的一级索引、二级索引
- 索引的两个知识点
- 知识点查找索引
- Android 知识点收藏索引
- 索引知识点总结
- 索引的知识点
- mysql知识点
- mysql知识点
- mysql知识点
- MySql知识点
- Android N 版本迭代/应用内升级 FileUriExposedException问题处理
- 大数据时代的数据存储,非关系型数据库MongoDB
- Hibernate配置常见问题汇总
- VS QT设置应用程序图标
- PLSQL 执行存储过程 17位随机时间,随机码生成
- Mysql 索引知识点
- Maven客户端只能通过Nexus私服下载Jar包构件
- static extern const 静态全局变量与全局变量的区别
- Edit Distance(编辑距离)
- 孙子兵法-始计篇
- 二、数字的校验最多2位小数的校验例子:
- (转)Android推送通知指南
- mysql数据库更新错误进行恢复
- JNI C调用Java