2015-10-06 64 views
0

我有这个表500,000行MYSQL - 为了通过索引列

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 

和这个解释

enter image description here

,但我不能添加此条件

`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 

如果任何一个也不会好,任何一个可以告诉我的大博客,请是如何让命中的职位?

+3

为什么地球上你想加入自己的表? – Victor

+1

简化您的OP,从OP的CREATE TABLE中删除未使用或不重要的列,删除除简单内容的5条记录以外的所有数据。不要解释你在其他实验中做了什么,而只是根据这5个样本记录,你的预期结果是什么。 – Alex

+1

我们不知道你应该添加哪一个,除非你解释你想要得到的结果。 – Barmar

回答

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 
+0

谢谢你的帮助,这个问题让我发疯,我可以没有解决它sence 6天,你可以请给我一些sql代码来测试它,我没有大的sql知识,请帮助我 –