在 MySQL 8.0 中,in 条件中的参数数量有 10000 个,导致查询时长过长,接口响应超时的分析
1、in 条件中的参数数量有 10000 个(产品需要上限是 10000 个),导致查询时长过长,接口响应超时。如图1

{
"filter": {
"plat_order_id": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
...,
10000
]
},
"page": 1,
"per_page": 100
}
{
"status_code": 500,
"code": 0,
"message": "Maximum execution time of 300 seconds exceeded",
"trace": {
"line": 420,
"file": "E:\\wwwroot\\erp-backend\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php",
"class": "Symfony\\Component\\ErrorHandler\\Error\\FatalError",
"trace": [
"#0 {main}"
]
}
}
2、当将 plat_order_id 的参数数量从 10000 个减少至 5 个后,接口响应不再超时,表中的记录总数为 2000 万条。如图2

3、生成 SQL 如下
select
count(*) as aggregate
from
`orders`
where
`orders`.`plat_order_id` in ('95798');
4、调整 SQL,决定强制使用索引 USE INDEX,不再超时
select
count(*) as aggregate
from
`orders` USE INDEX(`orders_plat_order_id_index`)
where
`orders`.`plat_order_id` in ('95798')