我有一个大约有 8.5m 行的表格。该表是 tokudb,它具有下面描述的索引。在尝试运行如下更新语句时,我遇到了令人沮丧的性能:
update retail.lw_item_discovery
set price = 'X',
prev_price = 'Y',
last_updated = '2016-04-13',
last_price_change = '2016-04-13'
where market = 'XX'
and sku = '123456'
Run Code Online (Sandbox Code Playgroud)
执行此更新需要 40 秒以上的时间。还有其他类似的更新经常发生,但是这台机器的 I/O 子系统并没有受到丝毫压力(RAID SSD),并且还有大量可用的 RAM。
EXPLAIN
产量:
update retail.lw_item_discovery
set price = 'X',
prev_price = 'Y',
last_updated = '2016-04-13',
last_price_change = '2016-04-13'
where market = 'XX'
and sku = '123456'
Run Code Online (Sandbox Code Playgroud)
基于此 - 它选择PRIMARY
索引而不是其他索引之一,例如cl_unique_idx
在前两个位置的 where 语句中具有两列的索引。所以我很难过为什么计划者选择了PRIMARY
而不是导致性能如此糟糕。以下是索引列表:
+----+-------------+-------------------+------------+-------+------------------------------------------------------------+---------+---------+------+------+----------+------------------------------+
| id | select_type | table | partitions | …
Run Code Online (Sandbox Code Playgroud)