如何正确地将索引应用于我的mysql数据库

时间:2012-04-25 06:41:11

标签: mysql indexing query-optimization

目前我遇到了对数据库查询速度慢的问题 - 查询时间从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个百万个条目,并且每天增加1-2个条目。

$ filter变量包含其他过滤器。所以其他一些AND语句,根据用户输入随机生成。但它只过滤content.text和created_at date。


1 个答案:

答案 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