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 十 慢 ...
随机推荐
- Linux上安装JDK环境变量配置
http://blog.chinaunix.net/uid-12115233-id-3304951.html Jdk: jdk-6u1-linux-i586 Tomcat: apache-tomcat ...
- C# 之 Word光标移动 GoTo 方法
对于 Document 或 Range对象:返回一个 Range对象,该对象代表指定项(例如页.书签或域)的开始位置. 对于 Selection对象:将插入点移至指定项前面的字符位置,并返回一个 Ra ...
- Android打地鼠游戏源码带道具购买的Android游戏开发
这是一款基于安卓的打地鼠游戏,界面简洁,有level模式打地鼠和无尽模式打地鼠两种游戏模式,并可以通过商店使用金币进行道具的购买,道具可以让你更容易通关:同时金币可以在游戏通关的时候获取.工程中有较为 ...
- C语言里的文件函数
1.File *pf = fopen("文件名","打开方式"); 文件名可以加路径,两个"\\"或者一个"/" 打开方 ...
- Python 文件操作模块 shutil 详解
1.导入模块 shutil import shutil 2.shutil方法 2.1 shutil.copy(src,dst) //将 src 复制到 dst 保留文件权限 例:将Alan复制到 ...
- 有关于Algorithm的基础介绍
Niklaus Wirth:Algorithm + Data Structures = Programs 这句话呢,觉得很正确,算法和程序是不同的概念,算法的思想呢有递推,枚举,分治,贪婪,试探法,模 ...
- Vimtutor练习心得
A. 光标定位(482) ctr + g 显示光标当前所在的行数 shift + g(G) 光标移动到文档末尾 gg 移动到文档首行 数字 + G ...
- ASP.NET MVC 4应用程序文件夹
App_Start It has configuration classes to reduce clutter code in the Global.asax 它包含了配置类来减少在Global.a ...
- Android 内存溢出管理与测试
今天发现正在做的项目,时不时的会报错:dalvikvm heap out of memory on a 7458832-byte allocation (堆分配的内存溢出) 为什么会内存溢出呢?我以前 ...
- 在shell的if条件里,判断 a>0 且 (b>0 或 c>0) ,如何编写?
if [ $b -gt 0 -o $c -gt 0 -a $a -gt 0 ]; then.fi对shell中的关系运算符说明如下:-gt 表示greater than,大于-lt 表示less th ...