我有这个表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
和这个解释
,但我不能添加此条件
`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
如果任何一个也不会好,任何一个可以告诉我的大博客,请是如何让命中的职位?
为什么地球上你想加入自己的表? – Victor
简化您的OP,从OP的CREATE TABLE中删除未使用或不重要的列,删除除简单内容的5条记录以外的所有数据。不要解释你在其他实验中做了什么,而只是根据这5个样本记录,你的预期结果是什么。 – Alex
我们不知道你应该添加哪一个,除非你解释你想要得到的结果。 – Barmar