![](/img/trans.png)
[英]MySql Filesort and temporary when order by indexed column and not when ordering on pk
[英]MYSQL - order by indexed column
我有这张有500,000行的桌子
CREATE TABLE IF NOT EXISTS `listings` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`source_id` int(10) unsigned NOT NULL,
`cat_id` mediumint(5) NOT NULL,
`title` mediumtext NOT NULL,
`views_point` int(10) unsigned NOT NULL DEFAULT '0',
`publishedon_hourly` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `views_point` (`views_point`),
KEY `listings` (`publishedon_hourly`,`published`,`cat_id`,`source_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED AUTO_INCREMENT=365513 ;
我想这样查询
SELECT *
FROM listings
WHERE (
`publishedon_hourly`
BETWEEN UNIX_TIMESTAMP( '2015-09-5 12:00:00' )AND UNIX_TIMESTAMP( '2015-10-5 12:00:00' ) ) AND ( published =1 ) AND cat_id
IN ( 1, 2, 3, 4, 5 )
ORDER BY views_point DESC
LIMIT 10
这个查询有些时间可以按照我想要的工作( 见此 ),但是经过一些意见,这是不正确的,我在网上搜索了解决方案,发现了
这个: http : //venublog.com/2007/11/29/mysql-how-to-avoid-filesort/和这个: http : //www.getsymphony.com/discuss/issues/view/657/和我添加在views_point
上views_point
然后尝试此查询
select t1.*
from listings t1
left outer join listings t2 on (t1.views_point=t2.views_point)
order by t1.views_point
limit 10
这是解释
但我不能添加此条件
`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 12:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' ) ) AND ( published =1 ) AND cat_id = 5
我不知道我应该分配给哪个(t1或t2)?
在另一方面呢
SELECT *
FROM listings
WHERE (
`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 00:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 23:00:00' ))
AND (published =1)
and views_point is not null
ORDER BY views_point DESC limit 20
如果有人不好,请问大博客如何通过点击获得帖子?
您应该将listings
索引拆分为单独的索引。
除此之外,假设您按t1
排序,几乎可以肯定的是,对于所有条件都应指定t1
。
编辑:使用条件为
`t1`.`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 12:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' ) ) AND ( `t1`.`published` = 1 ) AND `t1`.`cat_id` = 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.