起因
準備數據
- 新建了一張測試表
-
CREATE TABLE `tb_demo` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `score` decimal(10,1) DEFAULT NULL, `remark` varchar(50) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
- 批量插入的存儲過程
-
DROP PROCEDURE IF EXISTS `insertdata`; DELIMITER $$ CREATE PROCEDURE `insertdata`(IN record INTEGER) BEGIN DECLARE number INTEGER ; SET number=1; START TRANSACTION; WHILE number <=record DO INSERT INTO tb_demo (name, score, remark, create_time) VALUES(CONCAT('哈哈', number), number, '我測試', NOW()); SET number =number+1; END WHILE; COMMIT; END$$ DELIMITER ;
- 新建一條普通索引
-
-- 200w條數據 執行差不多8分鐘 call `insertdata`(2000000);
測試
EXPLAIN select score from tb_demo where score > 200 and score < 500
爲啥圖中的 走了回表? 我理解只查詢了索引 不會去找表裏的其他數據啊???
接下來我又這麼做了一下
EXPLAIN select * from tb_demo where score > 200 and score < 500
what??? 查詢所有行 不回表了???