我有一个表定义如下:
| 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会使查询速度慢得多?有人能解释一下吗?
2条答案
按热度按时间jbose2ul1#
尝试添加所需的列(选择列名,…)而不是*或者参考这个。
为什么我的sql server在排序列被编入索引的情况下仍然排序缓慢?
0wi1tuuw2#
我不是mysqlMaven,也不能执行详细的分析,但我猜是因为您为
UNIQUE KEY
在WHERE
子句中,引擎可以直接使用索引去获取该行。然而,当你要求它
ORDER BY
这个id
列,它是PRIMARY KEY
,更改访问路径。引擎现在猜测,因为它有一个索引id
,您想按id
,最好按主键顺序获取数据,这样可以避免排序。但在这种情况下,它会导致较慢的结果,因为它必须将每一行与标准进行比较(表扫描)。请注意,这只是猜测。你需要
EXPLAIN
两种说法都是为了看看发生了什么。