MYSQL - 按索引列排序

Posted

技术标签:

【中文标题】MYSQL - 按索引列排序【英文标题】:MYSQL - order by indexed column 【发布时间】:2015-10-06 21:39:25 【问题描述】:

我有这个有 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 

这个查询有一段时间可以按我的意愿工作(see this),但经过一些意见,这是不正确的,我在网上搜索解决方案,我找到了

这个:http://venublog.com/2007/11/29/mysql-how-to-avoid-filesort/ 这个:http://www.getsymphony.com/discuss/issues/view/657/ 我在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

如果有人不好,谁能告诉我大博客如何通过点击获得帖子?

【问题讨论】:

你到底为什么要自己加入餐桌? 简化你的 OP,从CREATE TABLE 中删除未使用或不重要的列用于 OP,删除除 5 条内容简单的记录之外的所有数据。不要解释你在其他实验中尝试了什么,而只是根据这 5 条样本记录,你的预期结果是什么。 除非你解释你想要得到什么结果,否则我们不知道你应该把它添加到哪一个。 另外,加入同一个表时为什么要使用LEFT JOIN?不能有任何不匹配的行,所以你应该使用更高效的INNER JOIN @Victor 因为这个venublog.com/2007/11/29/mysql-how-to-avoid-filesort 【参考方案1】:

您应该将您的 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

【讨论】:

谢谢你的帮助,这个问题让我抓狂,我6天都解决不了,你能给我一些sql代码来测试一下吗,我对sql不太了解,请帮帮我

以上是关于MYSQL - 按索引列排序的主要内容,如果未能解决你的问题,请参考以下文章

Mysql原理篇之索引不懂不要瞎用---04

Mysql_索引

MySQL索引

什么是索引?

MySQL

MySQL学习之第五章-高级部分