合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度。

关于建立索引的几个准则:

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的语句相关推荐

  1. 通过索引优化含ORDER BY的MySQL语句

    核心提示:合理的建立索引能够加速数据读取效率,不合理的建立 索引反而会拖慢数据库的响应速度,索引越多,更新数据的速度越慢,当你的程序和数据库结构/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺 ...

  2. mysql索引空间太大_MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

  3. MySQL第九章索引_MySQL高级(索引优化+慢查询定位)

    一.先谈谈事务 1. ACID特性 1.1 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 1.2 一致性: 执行事务前后,数据库从一个一致性状态转换 ...

  4. Mysql 索引优化分析_如何优化MySQL的性能?从索引方面优化案例分析

    今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化. 建表 //建表 CREATETABLEIFNOTEXISTSstaffs( idINTPRIMARYKEYAUTO_INCREMENT, ...

  5. mysql三个字段最优索引_mysql 多列索引优化

    Mysql所有的列都可以使用索引,.对相关列使用索引是提高SELECT操作性能的最佳途径.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少256字 ...

  6. MySQL索引使用方法和性能优化

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  7. mysql单列索引和多列索引_浅谈MySQL索引优化

    索引基础知识总结及常见索引优化手段 一.索引简介 什么是索引? MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 可以简单理解为"排好序的快速查找数据 ...

  8. MySQL索引(B+Tree 索引、哈希索引、全文索引、 空间数据索引)、索引优化、优点、使用场景

    1. MySQL 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现. 1.1 B+Tree 索引 是大多数 MySQL 存储引擎的默认索引类型. 因为不再需要 ...

  9. mysql 重复率高字段 索引_MySQL性能优化(二)索引优化

    一.选择合适的列建立索引 1.在where从句,group by从句,order by从句,on从句中出现的列(select) 2.索引字段越小越好(表每页数据才会更多,IO效率会更高) 3.离散度大 ...

最新文章

  1. Python 3.9来了!这十个新特性值得关注
  2. 求n!中含有质因子p的个数
  3. C语言判断一个数是否是回文数
  4. $m$ 整除 $10^k$ 的一个充分条件
  5. 大白技术控 | Windows10X 模拟器简单上手体验
  6. 创办私营企业必做的16件事
  7. 【Docker】Mac下Docker启动Kubernetes
  8. 404 NOT FOUND!
  9. 电视机关机特效——android
  10. linux内核学习(5)山重水复疑无路*
  11. linear-gradient实现Ps标尺
  12. 什么是次世代游戏建模?角色和场景建模,哪个比较容易
  13. pythonapp爬虫库_GitHub - LJF2402901363/JobSearchApp: 基于Python的flask网络爬虫web项目
  14. 4298. 【NOIP2015模拟11.2晚】我的天
  15. 基于Zemax的望远镜物镜设计
  16. 【转】欧式空间与酉空间——概念区分
  17. 记一次 Centos7.x Hadoop3.x集群安装部署 Pig 0.17.0
  18. 【SystemC】(二)第一个SystemC程序
  19. 快速上手!java淘宝客(springboot)
  20. 计算机主板用塑料做的好吗,旧电脑零件千万别扔 重新利用竟还能做出这么多新设备...

热门文章

  1. Linux内核内存管理(3):kmemcheck介绍
  2. HPC高性能运算的发展应用场景以及高性能计算技术总结
  3. CPU Cache Line伪共享问题的总结和分析
  4. SSH远程连接:简单的连接
  5. scipy.signal.find_peaks(峰值检测)
  6. NodeMedia / NodeMediaClient-Android(一个简单,快速,免费的直播SDK)
  7. 秋叶一键重装系统连接服务器失败,如何解决远程桌面无法连接
  8. flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...
  9. java声明代码是什么_java安全编码指南之:声明和初始化说明
  10. php开发大型网站如何优化,PHP编写大型网站问题