一、索引基础知识
索引是数据库中常用的优化方式之一,可以提高查询的效率。比如在表中定义了一个唯一性索引,那么在插入数据时,如果插入的数据的索引列有重复,那么就会报错。而在大数据量的情况下,没有索引的查询很可能会需要扫描整张表甚至多张表,导致查询速度很慢。
在MySQL中,索引分为普通索引(INDEX)、唯一索引(UNIQUE)、全文索引(FULLTEXT)等。其中,唯一索引和普通索引的最大区别就是唯一索引要求列的取值是唯一的,而普通索引则不要求。
二、影响索引效率的因素
1、冗余索引。在表中建立过多的索引,不但会增加索引维护的负担,更重要的是会降低插入、更新和删除操作的效率。
2、数据分布不均匀。比如在查询某个城市的人口数量时,如果该城市的人口数量很小,而索引列又是该城市的名称,查询效率就会很低。
3、过长的索引列。索引列过长也会对查询性能产生影响。
三、MySQL中修改索引的方法
1、添加索引
添加索引可以通过ALTER语句实现。比如在people表的name列上添加索引:
ALTER TABLE people ADD INDEX name_idx(name);
其中,people为表名,name为索引列名,name_idx为索引名称。
2、修改索引
MySQL中可以修改索引名称、索引类型、索引列等。其中,修改索引列比较麻烦,需要先删除原来的索引,再重新创建索引。比如在people表的name列上删除索引,并新增在age列上添加索引:
ALTER TABLE people DROP INDEX name_idx; ALTER TABLE people ADD INDEX age_idx(age);
3、删除索引
删除索引可以通过ALTER语句实现。比如删除people表上的name列的索引:
ALTER TABLE people DROP INDEX name_idx;
四、使用explain查看SQL执行计划
使用EXPLAIN关键字可以查看SQL语句的执行计划,看看优化器是如何执行SQL语句的,可以用来分析查询效率问题和索引问题。执行计划可以看到查询使用了哪些索引,以及使用的索引的类型(全表扫描、索引扫描等)。可以根据执行计划来判定一个SQL语句是否需要优化,以及该优化的方向。
比如,查询people表中age为20岁的人,可以使用以下SQL语句查看执行计划:
EXPLAIN SELECT * FROM people WHERE age=20;
执行计划的结果如下:
+------+-------------+--------+-------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+--------+-------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | people | index | NULL | age | 4 | NULL | 1 | Using index | +------+-------------+--------+-------+---------------+------+---------+------+------+-------------+
从执行计划中可以看到,使用了age索引,索引类型为index,查询了1条记录,标注为Using index。
五、总结
MySQL中索引的使用和优化是提升查询效率的重要手段之一。添加、删除、修改索引,以及使用explain查看SQL执行计划,是MySQL中操作索引的重要方式。