20200714MySQL学习笔记(二)

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):当事务正确完成后,它对于数据的改变是永久性的。


脏读:
一个事务读取了另一个事务未提交的数据

不可重复读:
一个事务前后两次读取的同一数据不一致。(脏读回滚了,不可重复读没有回滚)

幻读:
指一个事务两次查询的结果集记录数不一致

什么是阻塞?
由于不同锁之间的兼容关系,造成的一事务需要等待另一个放其所占用的资源的现象

如何处理死锁

数据库自行回滚占用资源少的事务
并发事务按相同顺序占有资源
 

你可能感兴趣的:(大数据之路,mysql)