mysql创建索引的语句_mysql创建索引时如何考虑order by查询

时间:2020-11-30  来源:mysql教程  阅读:

给表加索引时,其中一些查询会用到order by ,group by之类的,在低版本(有ICP之前版本)中可能会遇到一种情况,where查询用到索引,那么order by就无法用到索引,当然我们可以创建联合索引,那么什么情况下创建联合索引是有效的呢?可以通过explain 看order by是否有file sort,where是否使用到了索引。

那么order by 如何避免file sort,之后的索引应该如何创建,在这里做下总结:1、根据索引查询数据后,是否还需要排序,如果需要就会产生file sort,否则不会;所以在创建索引的时候需要特别注意,能将避免file sort的尽可能通过创建索引来解决,无法解决的就改sql,或者考虑其它办法。但需要考虑file sort不一定会慢,主要还得看数据量,有些情况还是允许file sort的,file sort也分为内存和磁盘,只有在sort buffer装载不下的情况,才能会磁盘中去进行分块排序。

2、联合索引使用长度需要注意,看联合索引用到了几列,什么样了sql会用到索引的程度。如,a为范围查询,<、>、!=,那么b就无法使用到(不支持ICP情况)。只能当前缀列为= 、<=或者>=时,后面的列才会用到。

如下是联合索引idx_a_b_c(a,b,c)各种查询条件下是否有file sort,另外使用到的索引情况。(mysql版本,5.1.63)

 

思考:

create table ttt (
    id int(10) NOT NULL AUTO_INCREMENT,
    uid int(10) NOT NULL,
    status tinyint(2) NOT NULL,
    ordertime int(11) NOT NULL,
    view varchar(20) NOT NULL
    primary key(id),
    key idx_status_rodertime(status,ordertime),
    key idx_uid(uid))engine = innodb;
)engine = innodb;
此表有3000多w.其中uid和status,ordertime的distinct值。

mysql> select count(distinct uid) from ttt;
+------------------------+
| count(distinct uid) |
+------------------------+
|                   9112 |
+------------------------+
1 row in set (51.89 sec)

mysql> select count(distinct status,ordertime) from ttt;     
+--------------------------------+
| count(distinct status,ordertime) |
+--------------------------------+
|                           5424 |
+--------------------------------+1 row in set (51.77 sec)
1 row in set (51.77 sec)
上表有这样的一个查询 :

select * from ttt where status=6 and ordertime >=1451012466 and ordertime <=1451016066 order by uid asc limit 100;
在目前这种情况下,如何优化这条sql,为什么?(数据库版本不限)

mysql创建索引的语句_mysql创建索引时如何考虑order by查询

http://m.bbyears.com/shujuku/113607.html

推荐访问:mysql 创建索引
相关阅读 猜你喜欢
本类排行 本类最新