MySQL优化知识点总结
前言
这篇博文是对尚硅谷MySQL高级课程的总结。
一、存储引擎简介
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 | 行锁,操作时只锁某一行,不对其他行有影响,适合高并发操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | 是 | 是 |
二、JOIN语句总结
其中因为MySQL没有外链接,所以外链接部分的SQL语句和图中的有区别,下面是上图中第五个图的SQL语句:
select * from tablea a left join tableb b on a.key = b.key
union
select * from tablea a right join tableb b on a.key = b.key
第六个图的SQL语句:
select * from tablea a left join tableb b on a.key = b.key where b.key is null
union
select * from tablea a right join tableb b on a.key = b.key where a.key is null
三、索引
1、什么是索引?
MySQL官方对索引的定义为:索引是帮助MySQL高速获取数据的数据结构,可以简单理解为,索引就是一种排好序的快速查找数据的数据结构。
2、MySQL中的索引是哪种数据结构?
MySQL中的索引,如果没有特别指明,都是指B+树,除了B+树这种索引外,还有哈希索引等。
3、索引的优点和缺点
既然索引是一种排好序的可以快速查找数据的数据结构,那么我想优点也就很明确了,那就是可以使用索引快速的查找到想找的数据,并且可以借助索引快速的排序,这里我还是希望不懂数据结构的可以去查查相关的资料,毕竟数据结构是比较抽象的,如果之前没有听说过肯定会想知道为啥用了数据结构就可以快速的排序和查找了,这里可以好好学习一下树这种数据结构,然后你就会豁然开朗。
索引的缺点就是索引本身会占用空间,并且会降低insert
、update
、delete
操作的性能,因为当表改动时,索引也会发生改变,索引的改变也会消耗时间,所以对于经常增删改的表并不适合创建索引。
4、索引的种类
- 单值索引:一个索引只包含一个列,一个表可以有多个单值索引,创建索引的语法:
第一种
CREATE INDEX indexName ON tableName(columnName);
第二种
ALTER table tableName ADD INDEX indexName(columnName);
- 唯一索引:索引列的值必须唯一,但是可以为空,创建索引的语法:
第一种
CREATE UNIQUE INDEX indexName ON tableName(columnName);
第二种
ALTER table tableName ADD UNIQUE [indexName] (columnName);
- 复合索引:一个索引包含多个列,创建索引的语法:
第一种
CREATE INDEX indexName ON tableName(columnName1, columnName2);
第二种
ALTER table tableName ADD INDEX indexName(columnName1, columnName2);
删除索引的语法:
drop index [indexName] on tableName;
查看索引的语法:
show index from tableName;
5、创建索引的一些建议
- 主键自动创建唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,比如外键需要建立索引
- 频繁更新的字段不适合创建索引
- where条件中用不到的字段不创建索引
- 在高并发下倾向于创建组合索引
- 需要排序的字段创建索引会大大提高排序的速度
- 查询中的统计或分组字段需要创建索引
- 表中数据很少的情况下不推荐创建索引
- 经常增删改的表不适合创建索引
- 数据重复且平均分配的表字段不适合创建索引
6、学一一下怎么怎么使用explain分析SQL性能
我们在学习如何创建高效的索引之前需要先学习一下怎么分析SQL的性能,要不我们怎么知道创建索引后是不是比以前快了很多,或者我们如何知道一条SQL是否用到了我们创建的索引,这些我们就需要使用explain命令,这里就给出一个博客,博客中有很详细的教程:MySQL 性能优化神器 Explain 使用分析
7、如何创建高效的索引
其实只要我们创建的索引在查询和排序时能够被用上,那么这个索引就是一个成功的索引,我们学习如何创建高效的索引其实就是学习如何创建一个不会失效的索引,我们以下索引为例:
CREATE INDEX indexName ON tableName(a, b, c);
索引的使用分为排序和查找,下面的规则适合于查找,也就是where子句中:
- 尽量使用全部全值匹配,例如
where a=1 and b=2 and c=3
,顺序可以打乱,但是最好按照索引的顺序进行查找。 - 最佳左前缀法则:如果是复合索引,查询从索引的最左前列开始,不跳过索引中的列
- 不在索引列上进行任何操作(计算、函数、类型转换)
- 尽量不要使用
select *
,尽量只查询索引中的列这里就是select a,b,c
- 不要使用
!=或者<>
,会导致索引失效 -
is null
、is not null
会导致索引失效 - 如果使用
like
,不要在查询目标前加%
,例如%abcd
、%das%
,可是使用dasd%
,但是会使复合索引中的一部分失效。 - 字符串类型的查找值一定要加单引号(重点)
- 少用
or
,用它来连接时会使索引失效
下面是排序时的规则,也就是用在order by
子句中:
- 同样是最佳左前缀法则:如果是复合索引,排序条件从索引的最左前列开始,不跳过索引中的列
- 如果前面的
where
子句中使用了最左前缀,并且是用的=
来限定条件,那么order by
中就可以越过最左前缀,直接使用后面的索引来作为排序条件,例如:where a=123 order by b,c
当使用group by
子句时,和使用order by
子句的规则相同。