多列索引的select * where * order by * 查询条件索引很难建立,需要不断调试,最后找出规则:

三原则:

1. 将经常要查询的字段放到多列索引的前面

2. 将要进行等值查询的字段放到多列索引前面

3. order by field的列放到多列索引的最后

以下是测试

先来一张表:

CREATE TABLE IF NOT EXISTS `article` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`uid` int(10) unsigned NOT NULL,

`category_id` int(10) unsigned NOT NULL,

`views` int(10) unsigned NOT NULL,

`comments` int(10) unsigned NOT NULL,

`title` varbinary(255) NOT NULL,

`content` text NOT NULL,

PRIMARY KEY (`id`)

);

再插几条数据:

INSERT INTO `article`

(`uid`, `category_id`, `views`, `comments`, `title`, `content`) VALUES

(1, 1, 1, 1, '1', '1'),

(2, 2, 2, 2, '2', '2'),

(1, 1, 3, 3, '3', '3');

需求:

查询category_id为1且comments大于1的情况下,views最多的uid。

先查查试试看:

EXPLAINSELECT uid FROM `article` WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;

看看部分输出结果:

很显然,type是ALL,即最坏的情况。Extra里还出现了Using filesort,也是最坏的情况。优

化是必须的。

嗯,那么最简单的解决方案就是加索引了。好,我们来试一试。查询的条件里即where之

后共使用了category_id,comments,views三个字段。那么来一个联合索引是最简单的了。

ALTER TABLE `article` ADD INDEX x ( `category_id` , `comments`, `views` );

结果有了一定好转,但仍然很糟糕:

type变成了range,这是可以忍受的。但是extra里使用Using filesort仍是无法接受的。

但是我们已经建立了索引,为啥没用呢?

这是因为按照BTree索引的工作原理,先排序category_id,如果遇到相同的category_id则再

排序comments,如果遇到相同的comments则再排序views。当comments字段在联合索引

里处于中间位置时,因为comments  >  1条件是一个范围值(所谓range),MySQL无法利用

索引再对后面的views部分进行检索,即range类型查询字段后面的索引无效。

那么我们需要抛弃comments,删除旧索引DROP INDEX x ON article;

然后建立新索引:ALTER TABLE `article` ADD INDEX y ( `category_id` , `views` ) ;

接着再运行查询:

可以看到,type 变为了ref,Extra中的Using filesort也消失了,结果非常理想。

http://hi.baidu.com/jqxw4444/item/e3cf91393fa89f9bb80c0388

mysql order by多列_mysql 多列索和order by相关推荐

  1. mysql 修改列名和属性_mysql增加列修改列名列属性以及删除列

    首先推荐一本初学者的书,一个小册子:<mysql必知必会>简介实用,权威:有点贵,昨天才买的. http://www.2cto.com/ebook/201112/30389.html 正文 ...

  2. mysql order by 索引名字_MySQL如何利用索引优化ORDER BY排序语句

    MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...

  3. mysql 循环创建列_mysql – 查询列中的循环值

    我需要创建一个查询,一次只将一列的值移动一行↑: +------------+----------------+ | anotherCOL | values_to_loop | +---------- ...

  4. mysql数据库最多列_mysql多列索引和最左前缀

    数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度. 索引优化是数据库优化的最重要手段. 如果查询语句使 ...

  5. mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析

    索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...

  6. mysql 增加主键列_MySQL添加列、删除列,创建主键等常用操作总结

    一. 列常用操作 ① 添加新的一列test_column,并将其作为主键,FIRST将其放在表中第一行,auto_increement是自动增长 alter table test_table add  ...

  7. mysql查询多造一列_mysql某列多值查询_MySQL

    要求:查询文章内容既包含aa且包含cc的所有文章的文章标题 查询SQL:SELECT kk.`title`,COUNT(1) times FROM (SELECT `title`, `content` ...

  8. mysql 字段内部转行_mysql 列转行、列转行的有关问题_mysql

    mysql 列转行.列转行的问题 今天在逛大java吧的时候看到一个行转列.列转行的问题,看了之后还真的不知道怎么下手,可能平时用hibernate作为持久层用多了,sql语句也不会写了,赶紧去找度娘 ...

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

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

最新文章

  1. JAVA SE 学习day_10:集合、聊天室练习最终版
  2. [创业经验] 白手起家的艺术
  3. ARM64的启动过程之(二):创建启动阶段的页表
  4. 2019年9月中国编程语言排行榜,C#排第三
  5. 【渝粤题库】广东开放大学 外贸会计 形成性考核
  6. C++之构造函数、(构造)函数重载探究
  7. C#做小工具的时候碰到的问题
  8. 爬取搜狗微信文章笔记2
  9. 到大观园晨光茶社现场听了场相声
  10. 如何设置文件的默认打开方式
  11. 22. 地下城与勇士
  12. Matplotlib绘制误差条形图、饼图、等高线图、3D柱形图
  13. 学大伟业Day解题报告
  14. 挑战微信,主打细分人群社交的超信有机会吗?
  15. 经典算法题-球和篮子
  16. Python基本元素:数字、字符串和变量
  17. 缘系天涯,一枕残梦千里殇岁月沉积着忧伤:伤感日志
  18. js延迟window.open window.location几秒之后跳转
  19. 2009年研究生入学考试西医综合科目试题
  20. Python相关软件下载教程

热门文章

  1. 乐高大颗粒作品10:滑板车的搭建
  2. Word文档(.docx) 转为 Markdown文档(.md)的一种方法 —— 一款word插件(Writage)
  3. 计算机英语课堂活动总结,英语(心得)之如何运用信息技术优化小学英语课堂教学...
  4. python开根号为整数_Python基础_1
  5. 查找亚马逊listing关键字的7个技巧值得你看!
  6. bzoj3307 雨天的尾巴
  7. Android屏幕适配相关知识
  8. android 适配2k屏幕分辨率,Android设备兼容处理(二):屏幕适配
  9. we learn考试能切屏吗_高中英语听力答题技巧,你真的会吗?从此刻开始练习!...
  10. 学习Linux命令(37)