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 十 慢 ...
随机推荐
- [cocos2dx笔记004] android添加�静态库project
(基于2.2.2版本号) 这步比較麻烦,不像vs2013那样好设置.參考了非常多文章.还是不能解决这个问题.仅仅有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的myli ...
- iOS开发——面试指导
iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...
- Web应用Word生成
前段时间接到一个Web应用自己主动生成Word的需求,现整理了下一些关键步骤拿来分享一下. 思路:(注:这里仅仅针对WORD2003版本号.其他版本号大同小异.) 由于WORD文件内部的数据及格式等是 ...
- Linux 服务器相关的一下链接
Apache 虚拟主机 VirtualHost 配置 以下是各操作系统的配置方法. Redhat Enterprise Linux Ubuntu Linux Windows Mac OS http:/ ...
- swfupload操作手册
SWFUpload SWFUpload 最初是Vinterwebb.se 开发的客户端文件上传工具.它联合javascript和flash,在浏览器中提供一个优于传统上传标签 <input ty ...
- angualrjs学习总结三(http、select、表格、指令以及事件)
一:http XMLHttpRequest:$http是angularjs的一个核心服务,用于读取远程服务器的数据.$http.get(url) 是用于读取服务器数据的函数.举例:<div ng ...
- 焦点轮播图——myfocus焦点图库
网站网址: http://demo.jb51.net/js/myfocus/demo.html 简单3步,你即可以用上myFocus. Step 1. 在html的标签内引入相关文件 <scri ...
- 关于Eclispe插件开发起步(一)
Eclipse中三个最吸引人的地方是: 第一是它创新性的图形API,就是SWT/JFace. 第二是它的插件机制. 第三个是利用它的插件机制开发众多功能强大的插件. 插件成就了Eclipse的今天.E ...
- Echarts基于动态数据初步使用 及问题 代码记录.
ECHARTS 插件 基本的动态数据展示(横向图) 下载 echarts.commn.min.js文件 在页面中进行引用, 并为Echarts图形准备一个div盒子 <!-- 引入插件 --&g ...
- 【转】ArrayList的toArray,也就是list.toArray[new String[list.size()]];,即List转为数组
[转]ArrayList的toArray ArrayList提供了一个将List转为数组的一个非常方便的方法toArray.toArray有两个重载的方法: 1.list.toArray(); 2.l ...