从头开始学MySQL-------性能优化

1.使用LIKE关键字可能触发不了索引

        首先执行下面的SQL,准备一些数据。

DROP TABLE IF EXISTS t_student;

CREATE TABLE `t_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `nameIdx` (`name`(3))  -- 增加一列索引
) 
DROP PROCEDURE IF EXISTS insertStu;
 
DELIMITER //
CREATE PROCEDURE insertStu(IN myCount INT(11))
BEGIN
    DECLARE id INT(11) DEFAULT 0;
    WHILE id < myCount DO
        SET id = id + 1;
        INSERT INTO t_student VALUES(NULL,CONCAT('大宇',''+id),id+22);
    END WHILE; -- 
END //
DELIMITER ; 

CALL insertStu(10);

        t_student表的数据 

 

         首先看这张表里面的索引。

SHOW INDEX FROM t_student;

  
        除了主键的唯一索引以外,在name这一列上添加了nameIdx索引。

        再来看看使用模糊查询,会不会影响索引的使用。

EXPLAIN SELECT * FROM t_student WHERE name LIKE '%大宇1';

  

        从上述红色方框里面可知,没有使用任何索引,并且查询了10条数据,造成了全表扫描。原因是因为,只有"%"不在第一个位置的时候,索引才会被使用。

        再来写一个SQL来证明上述的结论。

EXPLAIN SELECT * FROM t_student WHERE name LIKE '大宇1%';

  

        上述分析结果说明这次使用了名为'nameIdx'的索引,并且只扫描了2条记录。索引的威力发挥了出来。

使用LIKE关键字可能不会触发索引,因此,只有"%"不在第一个位置,索引才会发挥左右。

2.使用OR关键字的查询语句

查询语句中的查询条件只有OR关键字,并且OR关键字前后两个条件中的列都是索引的时候,才会使用索引。

SHOW INDEX FROM t_student;

  

       在这张表里面里,共有三个列,分别为id、name、age,id使用的主键索引,name使用的是nameIdx索引,而age列上没有索引。

 EXPLAIN SELECT * FROM t_student WHERE id=1 OR name = 'test'

  

        根据上述执行结果,在执行SQL过程中仅仅使用了OR关键字,并且过滤条件是id与name,在红色方框里面显示了使用的索引。本次查询扫描了扫描了2条记录。

        再执行下面的SQL,其中id有索引,age没有索引,看看情况会是什么样子。 

EXPLAIN SELECT * FROM t_student WHERE id=1 OR age = 22

  

        possible_keys说明了可能用到id的主键索引,但是key字段说明本次扫描实际没有用到任何索引。因此,rows的值为10,说明出现了全表扫描。

 结论:查询语句中的查询条件只有OR关键字,并且OR关键字前后两个条件中的列都是索引的时候,才会使用索引。

 

posted @ 2022-07-17 12:15  小大宇  阅读(16)  评论(0编辑  收藏  举报