目前我遇到了对数据库查询速度慢的问题 - 查询时间从0.0005秒到70秒不等。
目前我的包含内容的表结构如下:
CREATE TABLE IF NOT EXISTS `content` ( `content_id` int(11) NOT NULL AUTO_INCREMENT, `content_url` text NOT NULL, `content_text` text NOT NULL, `seed_id` int(11) NOT NULL, `created_at` bigint(20) NOT NULL, `image` varchar(2000) DEFAULT NULL, `price` varchar(300) DEFAULT NULL, PRIMARY KEY (`content_id`), UNIQUE KEY `CONTENT_TEXT_UNIQUE` (`content_text`(255)), KEY `FK_SEED_CODE` (`seed_id`), KEY `CONTENT_TEXT_TIME_INDEX` (`content_text`(255),`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=111357870 ; ALTER TABLE `content` ADD CONSTRAINT `FK_SEED_ID` FOREIGN KEY (`seed_id`) REFERENCES `seed` (`seed_id`) ON DELETE CASCADE ON UPDATE CASCADE;
目前我只有2个数据库查询:
SELECT seed.seed_code,content.content_id as id, content.content_url, content.content_text, content.created_at, content.image, content.price FROM content LEFT JOIN seed ON content.seed_id = seed.seed_id WHERE seed.seed_switch = 1 AND seed.seed_status_id = 3 AND seed.seed_id in ( SELECT seed_id FROM seed WHERE storage_id ='.$storage.') '.$filter.' ORDER BY content.content_id DESC, content.created_at DESC LIMIT 50
和
SELECT seed.seed_code,content.content_id as id, content.content_url, content.content_text, content.created_at, content.image, content.price FROM content LEFT JOIN seed ON content.seed_id = seed.seed_id WHERE seed.seed_switch = 1 AND seed.seed_status_id = 3 AND seed.seed_id in ( SELECT seed_id FROM seed WHERE storage_id ='.$storage.') ORDER BY content.content_id DESC, content.created_at DESC LIMIT 50
表种子包含±20个条目。这主要不会改变。
在内容表上创建的索引似乎无法正常工作,因为我的加载时间仍然很长。
DB的改进是什么?
内容表包含大约1个百万个条目,并且每天增加1-2个条目。
$ filter变量包含其他过滤器。所以其他一些AND语句,根据用户输入随机生成。但它只过滤content.text和created_at date。
答案 0 :(得分:2)
修改强> 好的,注意到你的创建表中的自动增量。您已经拥有或已经拥有数百万条记录(因为增量超过1亿)并且正在运行一个where-in subselect,而不是采用这种方法获得理想的性能。尝试以下查询,看看是否会改善加载时间。
您尚未提供所有详细信息(例如,有问题的表有多少记录以及'.$filter.'
的输出是什么),但子选择很可能是加载时间缓慢的原因。另外,节省一些打字和别名表!清理过的例子:
SELECT s.seed_code, c.content_id as id, c.content_url, c.content_text, c.created_at, c.image, c.price
FROM content c
JOIN seed s USING(seed_id)
WHERE s.seed_switch = 1
AND s.seed_status_id = 3
AND s.storage_id ='.$storage.'
'.$filter.'
ORDER BY c.content_id DESC
LIMIT 50