MySQL
一、SQL性能
性能下降SQL慢:
- 执行时间长
- 等待时间长
因素:
查询语句写的烂
-
索引失效
建了索引 没用上
关联查询太多 join (设计缺陷 或 不得已的需求)
服务器调优 及 各个参数设置 (缓冲、线程数等)
二、常见Join查询
SQL执行顺序:
-
人手写的
select xxx from xxx join xxx on join_condition where where_condition group by xxx having xxx order by xxx limit xxx;
-
机器读的
from xxx on join_condition join xxx where where_condition group by xxx having xxx select xxx order by xxx limit xxx;
图示:
内连接:
左连接
右连接
A独占
B独占
A和B的全集
A和B的交集的补集
实战:
员工表(tbl_emp):
部门表(tbl_dept):
需求获取员工 部门表的全集
当我们写sql
select * from tbl_emp e full outer join tbl_dept d on e.deptId = d.id;
发现会报错,我们的sql语法是没有问题的,但是mysql数据库不支持全连接
所以需要修改这个sql
select * from tbl_emp e left join tbl_dept d on e.deptId = d.id
union
select * from tbl_emp e right join tbl_dept d on e.deptId = d.id;
使用union关键字帮助我们 合并加去重
要想得到交集的补集
就需要 union emp dept表分别的单独数据 合并起来
例如;
select * from tbl_emp e LEFT JOIN tbl_dept d on d.id = e.deptId where d.id is null
UNION
select * from tbl_emp e right join tbl_dept d on d.id = e.deptId where e.id is null;
图示:
三、索引
索引是什么
本质:数据结构(帮助MySQL高效获取数据的数据结构)
提高查找效率,类比字典目录
排好序的快速查找数据结构就是索引
索引两大功能:
- 查找快
- 排好序
在数据之外,数据库系统还维护着满足特点查找算法的数据结构,这些数据以某种方式引用(指向)数据。
图示:
一般索引本身也很大,不可能全部存储在内存中,往往以索引文件形式存储在磁盘上。
我们平常所说的索引,如果没有全部声明,都是指B树(多虑搜索树,并不一定是二叉的)。其中聚集索引,次要索引,复合索引,前缀索引,唯一默认索引都是使用B+树索引,统称索引。
经常修改的字段不适合建立索引,service层的删除,传递到dao层可能就修改了
修改其标识位,将激活状态修改为休眠状态
- 需要做数据分析
- 影响索引效率
优势和劣势
优势:
- 提高数据检索效率,降低数据库的IO成本
- 降低数据排序成本,降低了CPU的消耗
劣势:
- 实际上索引也是一张表,该表保存了主键和索引列字段,并执行实体表的记录,索引列也要占用空间
- 索引提高了查询效率,但是也降低了更新效率(写操作),因为当我们修改索引列数据时,MySQL还要同时修改对象的索引信息
- 索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,需要花费时间研究建立最优秀的索引,或优化查询
索引分类和建索引命令语句
索引分类:
-
单值索引
一个索引只包含单个列,一个表可以有多个单列索引
-
唯一索引
索引的值必须唯一,但允许有空值
-
复合索引
即一个索引包含多个列
-
基本语法
-
创建 Create
create index indexName on table(colName); Alter table add index indexName on (colName);
-
删除 Drop
Drop index indexName on table;
-
查看 Show
Show index from table;
-
修改 Alter
Alter table tableName add primary key (column_list); 该语句添加一个主键,这意味着索引值必须是唯一的,且不能是Null Alter table tableName add unique indexName (column_list); 这条语句创建索引的值必须是唯一的(除了Null外,Null可能出现多次) Alter table tableName add indexName (column_list); 添加普通索引,索引值可出现多次 Alter table tableName add fulltext indexName (column_list); 该语句指定索引为fulltext 全文索引
-
索引结构
主要有四种
- BTree 索引(主要 )
- Hash 索引
- full-text 全文索引
- R-Tree 索引
B树(多路搜索树)
- 蓝色数据项
- 黄色 指针
根节点和枝节点的数据项都是用作比较的虚拟数据,底层的叶子节点的数据项是真实数据
要想查询数据项 29的数据 只需要三次IO(1. 比较根节点 2. 找p2 3.找到29数据项)
相当于B树有几层楼高就有几次IO,所以B树索引尽量设置的矮一点 宽度设计宽一些。
索引适合场景
- 主键自动建立唯一索引
- 频繁作为查询字段适合建立索引
- 查询中与其他表关联的字段 适合建立索引
- 频繁更新的字段不适合建立索引,因为每次更新数据的同时还需要更新索引树
- where条件里用不到的字段不创建索引
- 单键 / 组合索引 (高并发下适合建立组合索引)
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
- 查询中统计分组的字段
索引不适合场景
- 表记录很少时
- 经常增删改的字段不要建立索引
- 数据重复且表平均的字段,如果字段有重复的内容,建立索引就没有什么意义
图示: