0

目前,我的数据库查询速度很慢 - 查询时间从 0.0005 秒到 70 秒不等。

目前我的内容表结构如下:

如果不存在“内容”,则创建表(
  `content_id` int(11) NOT NULL AUTO_INCREMENT,
  `content_url` 文本不为空,
  `content_text` 文本不为空,
  `seed_id` int(11) NOT NULL,
  `created_at` bigint(20) 非空,
  `image` varchar(2000) 默认为空,
  `price` varchar(300) 默认为空,
  主键(`content_id`),
  唯一键 `CONTENT_TEXT_UNIQUE` (`content_text`(255)),
  KEY `FK_SEED_CODE`(`seed_id`),
  KEY `CONTENT_TEXT_TIME_INDEX` (`content_text`(255),`created_at`)
) 引擎=InnoDB 默认字符集=utf8 AUTO_INCREMENT=111357870 ;


更改表`内容`
  添加约束 `FK_SEED_ID` 外键 (`seed_id`) 参考 `seed` (`seed_id`) ON DELETE CASCADE ON UPDATE CASCADE;

目前我对数据库只有 2 个查询:

选择 seed.seed_code,content.content_id 作为 id, content.content_url, content.content_text, content.created_at, content.image, content.price FROM content
        左加入种子 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

选择 seed.seed_code,content.content_id 作为 id, content.content_url, content.content_text, content.created_at, content.image, content.price FROM content
        左加入种子 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

内容表包含大约 100 万个条目,并且每天都会以 1-2k 个条目增长。

$filter 变量包含额外的过滤器。所以还有一些其他的 AND 语句,它们是根据用户输入随机生成的。但它只过滤 content.text 和 created_at 日期。


4

1 回答 1

2

编辑 好的,注意到您的创建表中的自动增量。您拥有或曾经拥有数百万条记录(因为增量超过 1 亿条)并且正在运行 where-in 子选择,采用这种方法不会获得理想的性能。试试下面的查询,看看这是否会缩短加载时间。

您尚未提供所有详细信息(例如,有问题的表有多少条记录以及输出'.$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
于 2012-04-25T07:51:03.047 回答