mysql索引使用笔记
1.使用explain语句查看性能mysql> explain select product_id from orders where order_id in (123, 312, 223, 132, 224) \G
2.为什么要创建组合索引呢?如果只有一个索引,2个查询条件的语句中会先去索引查询一个条件,然后mysql要去磁盘上的表里面去查询另一个条件。如果有组合索引的话,mysql可以完全从索引中取到2个查询条件,速度自然会快
3.组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到;即使出现在select里而不是出现在where里也没关系,但是必须要出现;where语句中的顺序没有关系,因为它会自动根据匹配的索引顺序而调整
4.在mysql中执行查询时,只能使用一个索引,如果我们在where条件上分别建多个索引,执行查询时,mysql会选择一个最严格(获得结果集记录数最少)的索引,所以同样SQL的查询也有可能会用到不同的索引,根据返回的数据集的大小来决定。
5.在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边
6. ORDER BY 中的字段必须按照SQL语句中的顺序来建索引;
7. ORDER BY 中的字段的排序顺序必须一直,否则索引无效。
8. 建了索引不一定就有效,用实际的SQL检查一下。
9.建索引的时候,可以根据多个查询场景建多个联合索引(多个查询SQL),mysql会自行选择最优索引来查询(根据上面第4条)。
PS.因此在编写DAO和SQL代码的时候,要根据情况选择是要灵活还是性能,如果是压力很大的SQL,建议单独领出来,方便以后的SQL优化和索引建立,相反,没有性能压力的情况,SQL则可以选择写的通用点,复用性好点。
案例:
一个投票的业务场景中,在查询用户的投票记录中,可以根据投票的活动ID和投票人的ID,2个维度去建立索引,这样的话,在查询的时候,MYSQL会有2个possible_keys可以选择,根据返回的结果选择最适合的key(索引)
注意事项:
当一个表有多条索引可走时, Mysql 根据查询语句的成本来选择走哪条索引, 联合索引的话, 它往往计算的是第一个字段(最左边那个), 这样往往会走错索引. 如:
索引Index_1(Create_Time, Category_ID), Index_2(Category_ID)
如果每天的数据都特别多, 而且有很多category, 但具体每个category的记录不会很多.
当查询SQL条件为select …where create_time ….and category_id=..时, 很可能不走索引Index_1, 而走索引Index_2, 导致查询比较慢.
解决办法是将索引字段的顺序调换一下,改成Index_1(Create_Time, Category_ID), Index_2(Category_ID,Create_Time) ,注意,索引的顺序和最左边的那个索引,将会引导mysql选择成本最小的那个索引。
所以根据业务场景,写适合的索引非常重要
关于复合索引的起作用的情况:

上图是建立索引时起作用的示意图,其中,如果出现查询姓名和性别2个条件的情况,则会只使用姓名的索引,然后走where语句,而不会走完(姓名,年龄,性别)整个复合索引,可以用explain语句看索引长度来看
参考资料:
http://www.cnblogs.com/sunss/archive/2010/09/14/1826112.html
http://www.cnblogs.com/krisy/archive/2013/07/12/3186258.html
http://blog.csdn.net/lmh12506/article/details/8879916
mysql索引使用笔记的更多相关文章
- 关于Mysql索引的笔记
MySQL索引原理 索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能需 ...
- Mysql 索引复习笔记
之前学习索引后由于一直没怎么用,所以也只是粗略看了一下,最近发现索引的用处很大,并且也很多知识点,在此做复习记录. 什么是索引? 百度百科是这样描述的: 索引是为来加速对表中数据行中的检索而创建的一种 ...
- Mysql索引学习笔记
1.btree索引与hash索引 下列范围查询适用于 btree索引和hash索引: SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,2 ...
- MySQL索引优化 笔记
少取字段,建立合理的索引 表优化: 1 定长与变长分离 如果都是定长 查询比较快 因为每一行的字节都是固定的 fixed 2 常用字段和不常用字段要分离 用户表 常用 放主表 个人介绍不常用 还比较长 ...
- mysql颠覆实战笔记(二)-- 用户登录(一):唯一索引的妙用
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- SQL学习笔记五之MySQL索引原理与慢查询优化
阅读目录 一 介绍 二 索引的原理 三 索引的数据结构 四 聚集索引与辅助索引 五 MySQL索引管理 六 测试索引 七 正确使用索引 八 联合索引与覆盖索引 九 查询优化神器-explain 十 慢 ...
随机推荐
- javascript 递归之阶乘
阶乘,即5! = 5*4*3*2*1, 先看传统的做法,利用while循环实现: function factorial(num){ var result = num; if(num<0){ re ...
- 23、从头学Android之ContentProvider .
http://blog.csdn.net/jiahui524/article/details/7016430 应用场景: 在Android官方指出的Android的数据存储方式总共有五种,分别是:Sh ...
- 图源点到各个点的最短路径(DIJ)
# -*- coding: cp936 -*- import copy MV = 0xFFFFFFFF Vertexs = {0:'v0',1:'v1',2:'v2',3:'v3',4:'v4',5: ...
- Android 开发中的屏幕适配技术详解
本文主要介绍Android开发中比较头疼繁琐的一个问题-屏幕适配问题.主要从适配原因.基本核心概念.适配方法等方面介详细 介绍从而是的深入或者进一步对Android屏幕适配技术的掌握和理解. 真题园网 ...
- MySQL创建/删除/清空表,添加/删除字段
创建表: create table tablename (column_name column_type); create table table_name( id int not null auto ...
- <item name="android:windowNoTitle">true</item> 不起作用。标题栏未被隐藏
改变style.xml 加入 <item name="android:windowNoTitle">true</item> 按理说可以把标题栏隐藏,但是当s ...
- Android开发了解——ODEX
ODEX是安卓上的应用程序apk中提取出来的可运行文件,即将APK中的classes.dex文件通过dex优化过程将其优化生成一个·dex文件单独存放,原APK中的classes.dex文件会保留.这 ...
- CSS3 过渡transition 认识
其实,我一直觉得自己对新知识是以一种抵触的情绪在学习的.因为我总是习惯于将事情想得很复杂,所以也错过了很多美好的东西. 以前觉得CSS3的知识应该是很难的,很难理解的.但是我发现我觉得知识点很难,是因 ...
- Android之Http网络编程(二)
上一篇文章简单的介绍了Android中http的两种通信方式,并且分别用获取百度网页做了实例.但是在实际应用中,更多的是客户端通过请求的参数来实现在服务端的具体操作,并最终返回数据给客户端.因为我们不 ...
- mysql关键字讲解(join 、order by、group by、having、distinct)
1.join 1.1 OUTER JOIN:想要包含右侧表中的所有行,以及左侧表中有匹配记录的行. 1.11 Mysql中有左连接(left join): ...