1

我有一个定义如下的表:

| book | CREATE TABLE `book` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `provider_id` int(10) unsigned DEFAULT '0',
  `source_id` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `description` longtext COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`),
  UNIQUE KEY `provider` (`provider_id`,`source_id`),
  KEY `idx_source_id` (`source_id`),
) ENGINE=InnoDB AUTO_INCREMENT=1605425 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

当使用以下 sql 有大约 10 个并发读取时:

SELECT * FROM `book`  WHERE (provider_id = '1' AND source_id = '1037122800') ORDER BY `book`.`id` ASC LIMIT 1  

它变慢了,大约需要 100 毫秒。

但是,如果我将其更改为

SELECT * FROM `book`  WHERE (provider_id = '1' AND source_id = '221630001') LIMIT 1  

然后是正常的,需要几个毫秒。

我不明白为什么按 id 添加订单会使查询慢得多?谁能解释一下?

4

2 回答 2

0

尝试添加所需的列(选择列名,..)而不是 * 或参考这个。

为什么我的 SQL Server ORDER BY 很慢,尽管已对有序列进行了索引?

于 2018-05-07T03:54:14.120 回答
0

我不是 mysql 专家,无法进行详细分析,但我的猜测是,因为您为UNIQUE KEYinWHERE子句提供值,引擎可以直接使用索引获取该行。

但是,当您向列询问时ORDER BYid即 aPRIMARY KEY会更改访问路径。引擎现在猜测,由于它有一个索引id,并且您希望按 排序id,因此最好以 PK 顺序获取该数据,这样可以避免排序。但是,在这种情况下,它会导致结果变慢,因为它必须将每一行与标准进行比较(表扫描)。

请注意,这只是推测。您需要EXPLAIN两个语句才能看到发生了什么。

于 2018-05-07T04:05:21.570 回答