SQL优化
优化SQL的一般步骤
发现问题->分析执行计划->优化索引->改写SQL
发现问题
常见问题发现渠道
1.用户主动上报应用性能问题
2.分析慢查询日志发现存在问题的SQL
3.数据库时实监控长时间运行的SQL
通过慢查询日志发现问题
配置MySQL慢查询日志
set global slow_query_log = [ON|OFF]
set global slow_query_log_file = /sql_log/slowlog.log
set global long_query_time = xx.xxx秒
set global long_queries_not_using_indexes = [ON | OFF]
show variables like 'long_query_time';
去看慢查询日志
mysqldumpslow slowlog.log
SQL优化的手段
优化SQL查询所涉及到的表中的索引
改写SQL以达到更好的利用索引的目的
索引优化
索引的作用是什么?
告诉存储引擎如何快速的查找到所需要的数据
索引——就像是书中的章节,想看感兴趣的地方通过章节好定位—,如果没有章节要从头开始翻会很慢
索引优化
Innodb支持的索引类型
Btree 索引
自适应HASH索引
^(不是重点)
^全文索引
^空间索引
Btree索引的特点
以B+树的结构存储索引数据
1.Btree索引适用于全值匹配的查询
class_name='mysql'
class_name in ('mysql','postgreSQL')
2.Btree索引适合处理范围查找
study_cnt between 1000 and 3000
study_cnt > 3000
3.Btree索引从索引的最左侧列开始匹配查找列
create index idx_title_studyCnt on imc_course(title,study_cnt)
应该在什么列上建立索引?
where 子句的列
包含在order by 、 group by 、 distinct中的字段
多表JOIN的关联列
如何选择复合索引键的顺序?
区分度最高的列放在联合索引的最左侧
使用最频繁的列放在联合索引的最左侧
尽量把字段长度小的列放在联合索引列的最左侧
Btree索引的限制
只能从最左侧开始按索引键的顺序使用索引,不能跳过索引键
not in 和 <> 操作无法使用索引
索引列上不能使用表达式或是函数
索引使用的误区
-索引越多越好
-使用IN列表查询不能用到索引
-查询过滤顺序必须同索引键顺序相同才可以使用到索引
SQL优化的手段 二
SQL改写的原则
使用outer join 代替 not in
使用CTE代替子查询
拆分复杂的大SQL为多个简单的小SQL
巧用计算列优化查询
————————————————————————————————————————————————————————————————————————————————————————
事务
什么是事务?
事务是数据库执行操作的最小逻辑单元
事务可以由一个SQL组成也可以由多个SQL组成
原子性(Atomicity):操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
持久性(Durability):当事务正确完成后,它对于数据的改变是永久性的。
脏读:
一个事务读取了另一个事务未提交的数据
不可重复读:
一个事务前后两次读取的同一数据不一致。(脏读回滚了,不可重复读没有回滚)
幻读:
指一个事务两次查询的结果集记录数不一致
什么是阻塞?
由于不同锁之间的兼容关系,造成的一事务需要等待另一个放其所占用的资源的现象
如何处理死锁
数据库自行回滚占用资源少的事务
并发事务按相同顺序占有资源