有一张桌子:
`id` INT(10) NOT NULL AUTO_INCREMENT,
`status` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) USING BTREE,
当我处理流动语句(该表中有超过1000条记录)时,会处理表扫描。为什么主键索引不起作用?
SELECT * FROM t_test WHERE id = FLOOR(1 + RAND() * 1000)
当mysql通过随机id选择时索引无效并且有时返回两个不同的值
执行此操作时:
WITH abc AS (SELECT FLOOR(1 + RAND() * 1000) as R)
SELECT * FROM t_test WHERE id = (SELECT R FROM abc);
您可能期望 CTE 只返回一条记录,并且可以使用索引。
但是添加 EXPLAIN 时它显示 UNCACHEABLE:
id | 选择类型 | 桌子 | 分区 | 类型 | 可能的键 | 键 | key_len | 参考 | 行 | 过滤 | 额外 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 小学 | t_测试 | 空 | 全部 | 空 | 空 | 空 | 空 | 1024 | 100.00 | 使用地点 |
2 | 无法缓存 | 子查询 | 空 | 系统 | 空 | 空 | 空 | 空 | 1 | 100.00 | |
3 | 派生 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 没有使用桌子 |