100w测试数据,为什么加了索引查询反而变慢了?
建表:
create table tb_test(fval varchar(50));
———————————————-
插入测试数据:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `P_teset`()
BEGIN
DECLARE v_val VARCHAR(20);
DECLARE v_str VARCHAR(20);
DECLARE v_i INT ;
DECLARE v_j INT;
SET v_str =’abcdefghijklmnopqrstuvwxyz’;
SET v_i=0;
SET v_j=0;
WHILE v_i<600000 DO
SET v_val =”;
WHILE v_j< 13 DO
SET v_val= CONCAT(v_val,SUBSTRING(v_str,1,FLOOR(1+RAND()*26)));
SET v_j=v_j+1;
END WHILE;
SET v_j=0;
INSERT INTO tb_test(fval)
VALUES(v_val);
SET v_i =v_i+1;
END WHILE;
END$$
DELIMITER ;
———————————————-
测试like:
SELECT *
FROM tb_test
WHERE fval LIKE ‘%ab’;
70231条 用时0.531s
SELECT *
FROM tb_test
WHERE fval LIKE ‘ab%’
961406条用时1.422s
———————————————
加索引:
ALTER TABLE tb_test ADD INDEX my_index(fval);
———————————————
再测试:
SELECT *
FROM tb_test
WHERE fval LIKE ‘%ab’;
70231条 用时1.094s
SELECT *
FROM tb_test
WHERE fval LIKE ‘ab%’
961406条用时1.485s
表为MyISAM格式。
为什么加了索引却慢了?
LIKE ‘%ab’;不走索引
这个时间和缓存也有关系,你最好每次执行sql都重启下数据库已清空缓存
引用SELECT *
FROM tb_test
WHERE fval LIKE ‘%ab’;
70231条 用时0.531s
SELECT *
FROM tb_test
WHERE fval LIKE ‘ab%’
961406条用时1.422s
探讨
建表:
create table tb_test(fval varchar(50));
———————————————-
插入测试数据:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `P_teset`()
BEGIN
DECLARE v_val V……
你可以用 explain 分析你的sql语句,看你的索引是否利用到了!添加索引会产生磁盘碎片,占用资源空间,在插入或修改时都会操作索引!所以建索引一般都是在where条件后面的字段做索引!