按id排序的复合索引上的并发查询速度非常慢

3okqufwl  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(325)

我有一个表定义如下:

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

当有大约10个并发读与以下sql:

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

那是正常的,需要几毫秒。
我不明白为什么添加orderbyid会使查询速度慢得多?有人能解释一下吗?

jbose2ul

jbose2ul1#

尝试添加所需的列(选择列名,…)而不是*或者参考这个。
为什么我的sql server在排序列被编入索引的情况下仍然排序缓慢?

0wi1tuuw

0wi1tuuw2#

我不是mysqlMaven,也不能执行详细的分析,但我猜是因为您为 UNIQUE KEYWHERE 子句中,引擎可以直接使用索引去获取该行。
然而,当你要求它 ORDER BY 这个 id 列,它是 PRIMARY KEY ,更改访问路径。引擎现在猜测,因为它有一个索引 id ,您想按 id ,最好按主键顺序获取数据,这样可以避免排序。但在这种情况下,它会导致较慢的结果,因为它必须将每一行与标准进行比较(表扫描)。
请注意,这只是猜测。你需要 EXPLAIN 两种说法都是为了看看发生了什么。

相关问题