Mysql-高性能索引策略及不走索引的例子总结
Mysql-高性能索引策略
正确的创建和使用索引是实现高性能查询的基础。我总结了以下几点索引选择的策略和索引的注意事项:
索引的使用策略:
(PS:索引的选择性是指:不重复的索引值,和数据表的记录总数(#T)的比值 ,范围从1/#T 到1之间,索引的选择性越高则查询效率越高,因为选择性搞得索引可以让Mysql在查找时可以过滤更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是更好
计算列的选择性例子: mysql> select count(distinct city)/ count(*) from city_demo )
1.为很长的字符列建立索引,应使用前缀索引(或者使用哈希索引多维护一个hash列),前缀索引是一种能使索引更小,更快的有效办法。选择前缀的长度要保证有较高的选择性。
(原因:索引过长的字符列,会让索引变的大而且慢。)
缺陷:Mysql无法使用前缀索引和哈希索引做order by 和 group by,也无法使用前缀索引和哈希索引做覆盖扫描。
2.选择合适的索引列顺序构建复合索引(需要考虑WHERE 条件,排序和分组等情况。当不需要考虑排序和分组时,将选择性更高的列放在前面通常时比较好的,同时也需要结合WHERE 查询条件中列 的出现频率的高低来调整索引列的顺序)
3.尽量使用索引扫描来做排序
(注意事项:只有当索引的列顺序和order by 子句 顺序完全一致,并且所有列的排序方向(倒序或正序)Mysql才能使用索引排序。如果查询需要关联多张表,则只有当 order by 子句的字段全部为第一个表时,才能使用索引做排序。 order by 子句使用索引排序也需要遵循最左前缀原则。
EXPLAN 分析执行语句,如果type列的值为“index”,则说明mysql 使用了索引扫描来做排序)
4.大多数情况不需要冗余索引,应该尽量扩展已有的索引而不是创建新索引。但也有时候出于性能方面的考虑需要冗余索引。因为扩展已有的索引会导致其变得太大,从而影响其他使用该索引的查询性能。
5.查询考虑覆盖索引,覆盖索引不需要回表查询,效率更高。
(注意事项:虽然覆盖查询效率更好,但也不能一味的为了覆盖查询把所有查询返回的列都加上索引,索引越多,mysql插入速度越慢)
总结:
总的来说,编写查询语句应该尽可能选择合适的索引来避免单行查找,尽可能地使用数据的原生顺序从而避免额外的排序操作,并尽可能的使用索引覆盖查询。
一些索引不生效的例子总结:
假如有如下数据表 create table user (
name varchar(30) not null,
birthday date not null,
address varchar(100) not null,
age int(5) not null,
card varchar(18) not null,
createtime date not null,
key(name,birthday,adress),
key(age),
key(card)
);
1. select * from user where name="李先生" and adress="北京" and birthday="2011-11-11";
adress 和birthday列不走索引
(原因:违反最左前缀原则,顺序与复合索引顺序不一致)
2.select * from user where name="李先生" and birthday >"2011-11-11" and adress="北京" ;
adress 列不走索引
(原因:birthday 列的查询条件为范围查询,其右边的所有列都无法使用索引优化查询)
3.select * from user where name like "%李";
name 列不走索引
(原因:最左前缀匹配原则 ,like '李%' 走索引)
4.select * from user where name like "李%" and birthday="2011-11-11";
birthday 列不走索引
(原因:like '李%' 也属于范围查询 与第二条一致)
5.select * from user where age+10=30;
age 列不走索引
(原因:参与计算的列不走索引)
6.select * from user where LEFT(card,6)="231084";
card 列不走索引
(原因:使用函数的列不走索引)
7.select * from user where age=20 order by name asc , birthday desc;
order by 不能使用 索引扫描排序
(原因:虽然 order by 后的两个列 组成了最左前缀,但这个查询使用了两种不同的排序方向,索引列都是正序排列的)
8.select * from user where name like "李%" order by birthday;
order by 不能使用索引扫描
(原因:name 列使用了范围查询,复合索引其他的列不能使用索引)
9.如果类型是字符串,那一定要再条件中将数据使用引号引用起来,否则不使用索引
10.如果条件中有or 即使其中有条件索引也不会使用
(注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引)
Mysql-高性能索引策略及不走索引的例子总结的更多相关文章
- mysql 索引 大于等于 走不走索引 最左前缀
你可以认为联合索引是闯关游戏的设计 例如你这个联合索引是state/city/zipCode 那么state就是第一关 city是第二关, zipCode就是第三关 你必须匹配了第一关,才能匹配第二关 ...
- 什么是索引?Mysql目前主要的几种索引类型
一.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...
- 不要再问我 in,exists 走不走索引了
微信搜『烟雨星空』,获取最新好文. 前言 最近,有一个业务需求,给我一份数据 A ,把它在数据库 B 中存在,而又比 A 多出的部分算出来.由于数据比较杂乱,我这里简化模型. 然后就会发现,我去,这不 ...
- Update关联查询不走索引,效率低下
优化一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段.形如 Sql代码 update A set A.a=(select B.b from B where A.id=B.id); 原 ...
- mysql高性能索引策略
转载说明:http://www.nyankosama.com/2014/12/19/high-performance-index/ 1. 引言 随着互联网时代地到来,各种各样的基于互联网的应用和服务进 ...
- MySQL建立高性能索引策略
索引永远是最好的查询解决方案嘛? 索引并不总是最好的工具.总的来说,只有当索引帮助存储引擎快速查找到记录带来的好处大于其带来的额外工作(比如插入操作后索引的维护)时,索引才是高效的. 对于非常小的表: ...
- 高性能mysql——高性能索引策略
<高性能MySQL>读书笔记 一. 索引的优点 1. 索引可以让服务器快速定位到表的指定位置,大大减少了服务器需要扫描的数量: 2. 最常见的B-Tree索引按照顺序存储数据,可以用来做o ...
- mysql索引性能验证,高性能的索引策略
索引性能验证 1.无索引列的查询 在where条件中查询没有添加索引的列,性能会比较差.我们可以先在sqlyog中打开表t_user的数据,然后复制一个名字出来进行查询. /*无索引列的查询,索引不会 ...
- MySQL索引背后的之使用策略及优化(高性能索引策略)
为了讨论索引策略,需要一个数据量不算小的数据库作为示例.本文选用MySQL官方文档中提供的示例数据库之一:employees.这个数据库关系复杂度适中,且数据量较大.下图是这个数据库的E-R关系图(引 ...
随机推荐
- Java try catch语句块中try()的括号中代码作用
了解过Mybatis,都知道DefacltSqlSession是线程不安全的.每次执行查询都需要新建一个sqlSession.因此官方给的建议写法如下: Mybatis3 从 SqlSessionFa ...
- Serverless 下的微服务实践
作者:弈川 审核&校对:筱姜.潇航 编辑&排版:雯燕 微服务架构介绍 微服务架构诞生背景 在互联网早期即 Web 1.0 的时代,当时流行的是单体应用,研发团队比较小,主要是外部网页, ...
- python实现Canny边缘检测
一,定义与概述 使用图像梯度的算法,在有些场景不适用,如检测大量头发边缘,边缘不够细腻.所以有人提出了Canny算法! 非极大值抑制,保留极大值 参考:https://www.cnblogs.com/ ...
- airTest小程序自动化踩坑记(android设备)
一:怎么开启微信小程序的webview调试定位元素 操作如下(android设备): 1.打开X5内核的方法在聊天窗口任意输入"http://debugx5.qq.com" 点击& ...
- HCNP Routing&Switching之组播技术-组播基础
组播技术背景 随着internet网络的不断发展,网络中交互的各种数据.语音.视频信息数量突增:新型的在线直播.网络电视.视频会议等应用也在逐渐兴起:这些业务大多符合点到多点的模式,对信息安全性.传播 ...
- Qt Creator 源码学习笔记03,大型项目如何管理工程
阅读本文大概需要 6 分钟 一个项目随着功能开发越来越多,项目必然越来越大,工程管理成本也越来越高,后期维护成本更高.如何更好的组织管理工程,是非常重要的 今天我们来学习下 Qt Creator 是如 ...
- 记一次使用 SelectMany 的经历
最近在改造一个功能时为了减少循环的层数,于是想着将List列表映射为一个能直接使用颗粒大小的List列表,这样一层循环就可以解决问题. public class ConflictWordIte ...
- Codeforces 258E - Little Elephant and Tree(根号暴力/线段树+标记永久化/主席树+标记永久化/普通线段树/可撤销线段树,hot tea)
Codeforces 题目传送门 & 洛谷题目传送门 yyq:"hot tea 不常有,做过了就不能再错过了" 似乎这是半年前某场 hb 模拟赛的 T2?当时 ycx.ym ...
- 洛谷 P6478 - [NOI Online #2 提高组] 游戏(二项式反演+树形 dp)
题面传送门 没错这就是我 boom0 的那场 NOIOL 的 T3 一年前,我在 NOIOL #2 的赛场上折戟沉沙,一年后,我从倒下的地方爬起. 我成功了,我不再是从前那个我了 我们首先假设 A 拥 ...
- Java设计模式之(十四)——策略模式
1.什么是策略模式? Define a family of algorithms, encapsulate each one, and make them interchangeable. Strat ...