mysql索引 order by_MySQL 通过索引优化含ORDER BY的语句
合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度。
关于建立索引的几个准则:
1、合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度。
2、索引越多,更新数据的速度越慢。
3、尽量在采用MyIsam作为引擎的时候使用索引(因为MySQL以BTree存储索引),而不是InnoDB。但MyISAM不支持Transcation。
4、当你的程序和数据库结构/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺利解决,那就是应该考虑使用诸如memcached这样的分布式缓存系统的时候了。
5、习惯和强迫自己用EXPLAIN来分析你SQL语句的性能。
一个很容易犯的错误:
不要在选择的栏位上放置索引,这是无意义的。应该在条件选择的语句上合理的放置索引,比如where,order by。
例子:
SELECT id,title,content,cat_id FROM article WHERE cat_id = 1;
上面这个语句,你在id/title/content上放置索引是毫无意义的,对这个语句没有任何优化作用。但是如果你在外键cat_id上放置一个索引,那作用就相当大了。
几个常用ORDER BY语句的MySQL优化:
1、ORDER BY + LIMIT组合的索引优化。如果一个SQL语句形如:
SELECT [column1],[column2],.... FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];
这个SQL语句优化比较简单,在[sort]这个栏位上建立索引即可。
2、WHERE + ORDER BY + LIMIT组合的索引优化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] LIMIT[offset],[LIMIT];
这个语句,如果你仍然采用第一个例子中建立索引的方法,虽然可以用到索引,但是效率不高。更高效的方法是建立一个联合索引(columnX,sort)
3、WHERE + IN + ORDER BY + LIMIT组合的索引优化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] IN ([value1],[value2],...) ORDER BY[sort] LIMIT [offset],[LIMIT];
这个语句如果你采用第二个例子中建立索引的方法,会得不到预期的效果(仅在[sort]上是using index,WHERE那里是using where;using filesort),理由是这里对应columnX的值对应多个。
这个语句怎么优化呢?我暂时没有想到什么好的办法,看到网上有便宜提供的办法,那就是将这个语句用UNION分拆,然后建立第二个例子中的索引:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value1] ORDER BY [sort] LIMIT[offset],[LIMIT]
UNION
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value2] ORDER BY [sort] LIMIT[offset],[LIMIT]
UNION
……
但经验证,这个方法根本行不通,效率反而更低,测试时对于大部分应用强制指定使用排序索引效果更好点
4、不要再WHERE和ORDER BY的栏位上应用表达式(函数),比如:
SELECT * FROM [table] ORDER BY YEAR(date) LIMIT 0,30;
5、WHERE+ORDER BY多个栏位+LIMIT,比如
SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;
对于这个语句,大家可能是加一个这样的索引(x,y,uid)。但实际上更好的效果是(uid,x,y)。这是由MySQL处理排序的机制造成的。
以上例子你在实际项目中应用的时候,不要忘记在添加索引后,用EXPLAIN看看效果。
mysql索引 order by_MySQL 通过索引优化含ORDER BY的语句相关推荐
- 通过索引优化含ORDER BY的MySQL语句
核心提示:合理的建立索引能够加速数据读取效率,不合理的建立 索引反而会拖慢数据库的响应速度,索引越多,更新数据的速度越慢,当你的程序和数据库结构/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺 ...
- mysql索引空间太大_MySQL优化索引
1. MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...
- MySQL第九章索引_MySQL高级(索引优化+慢查询定位)
一.先谈谈事务 1. ACID特性 1.1 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 1.2 一致性: 执行事务前后,数据库从一个一致性状态转换 ...
- Mysql 索引优化分析_如何优化MySQL的性能?从索引方面优化案例分析
今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化. 建表 //建表 CREATETABLEIFNOTEXISTSstaffs( idINTPRIMARYKEYAUTO_INCREMENT, ...
- mysql三个字段最优索引_mysql 多列索引优化
Mysql所有的列都可以使用索引,.对相关列使用索引是提高SELECT操作性能的最佳途径.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少256字 ...
- MySQL索引使用方法和性能优化
关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...
- mysql单列索引和多列索引_浅谈MySQL索引优化
索引基础知识总结及常见索引优化手段 一.索引简介 什么是索引? MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 可以简单理解为"排好序的快速查找数据 ...
- MySQL索引(B+Tree 索引、哈希索引、全文索引、 空间数据索引)、索引优化、优点、使用场景
1. MySQL 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现. 1.1 B+Tree 索引 是大多数 MySQL 存储引擎的默认索引类型. 因为不再需要 ...
- mysql 重复率高字段 索引_MySQL性能优化(二)索引优化
一.选择合适的列建立索引 1.在where从句,group by从句,order by从句,on从句中出现的列(select) 2.索引字段越小越好(表每页数据才会更多,IO效率会更高) 3.离散度大 ...
最新文章
- Python 3.9来了!这十个新特性值得关注
- 求n!中含有质因子p的个数
- C语言判断一个数是否是回文数
- $m$ 整除 $10^k$ 的一个充分条件
- 大白技术控 | Windows10X 模拟器简单上手体验
- 创办私营企业必做的16件事
- 【Docker】Mac下Docker启动Kubernetes
- 404 NOT FOUND!
- 电视机关机特效——android
- linux内核学习(5)山重水复疑无路*
- linear-gradient实现Ps标尺
- 什么是次世代游戏建模?角色和场景建模,哪个比较容易
- pythonapp爬虫库_GitHub - LJF2402901363/JobSearchApp: 基于Python的flask网络爬虫web项目
- 4298. 【NOIP2015模拟11.2晚】我的天
- 基于Zemax的望远镜物镜设计
- 【转】欧式空间与酉空间——概念区分
- 记一次 Centos7.x Hadoop3.x集群安装部署 Pig 0.17.0
- 【SystemC】(二)第一个SystemC程序
- 快速上手!java淘宝客(springboot)
- 计算机主板用塑料做的好吗,旧电脑零件千万别扔 重新利用竟还能做出这么多新设备...
热门文章
- Linux内核内存管理(3):kmemcheck介绍
- HPC高性能运算的发展应用场景以及高性能计算技术总结
- CPU Cache Line伪共享问题的总结和分析
- SSH远程连接:简单的连接
- scipy.signal.find_peaks(峰值检测)
- NodeMedia / NodeMediaClient-Android(一个简单,快速,免费的直播SDK)
- 秋叶一键重装系统连接服务器失败,如何解决远程桌面无法连接
- flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...
- java声明代码是什么_java安全编码指南之:声明和初始化说明
- php开发大型网站如何优化,PHP编写大型网站问题