一、本文主旨
二、面试题
2.1 索引的建立原则:
总:建立索引时,我们应该尽量选择唯一性索引,对高频查询字段、以及经常需要排序、分组、联合操作的字段建立索引;索引应当尽量选择数据量小的字段,如果特殊情况需要使用到数据量大的字段,那么最好使用其前缀来索引;同时要避免索引的滥用,过多的索引会增加修改表的操作,占用更多的磁盘啊空间,并且难以保证每个索引都能有效利用,像数据量小的表使用索引更会带来负优化,最好能定期维护、删除不必要的索引;
分:有以下八条:
1. 选择唯一性索引;
2. 对高频查询字段创建索引;
3. 对经常需要排序、分组、联合操作的字段建立索引(order by,group by,distinct,union);
4. 限制索引的数目(大量索引会增加修改表的操作,占用磁盘空间,并且难以保证每一个索引都能得到有效利用);
5. 尽量使用数据量小的字段作为索引;
6. 数据量小的表最好不要用索引,会造成负优化;
7. 数据量大的字段最好使用前缀来索引(前面的若干字符,如TEXT 和 BLOG 类型);
8. 删除不再使用、使用少的索引;
2.2 查看MySQL语句执行计划(explain关键字有没有使用过)
总:explain关键字,能帮助我们了解SQL语句的执行计划,从生效索引、连接类型、实际采用SQL运行优化选择等角度去优化SQL;
分:下表解释了explain
关键字的每一个字段,她能帮我们了解SQL的执行计划,观其性,我们能对生效索引、连接类型、实际采用SQL运行优化选择等角度去优化SQL;
mysql> explain select * from student s, usr u where u.name=s.name;
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
| 1 | SIMPLE | u | ALL | NULL | NULL | NULL | NULL | 4 | |
| 1 | SIMPLE | s | ALL | NULL | NULL | NULL | NULL | 9 | Using where; Using join buffer |
+----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
2 rows in set (0.00 sec)
字段 | 含义 |
---|---|
id | 操作表的顺序,越大优先级越高,同级由上至下 |
select_type | 查询类型 |
table | 输出行所引用的表 |
type | 连接使用的类型,最差的是all全表扫描 |
possible_keys | 可以使用哪些索引有助于查询 |
key | 实际使用的索引 |
key_len | 索引长度 |
ref | 索引的那一列被使用了 |
rows | 必须检查的用来返回请求数据的行数 |
Extra | sql语句实际运行的优化选择 |