视频链接:https://www.bilibili.com/video/BV1Vs411M7Qi?p=53
1.索引的作用:排序和查询。
2.链接层--服务层--引擎层--存储层。
3.innodb:事务优先;myisam:性能优先。
4.sql语句实际解析过程:from...on...join...where...group by...having...select和distinct...order by...limit...
https://www.cnblogs.com/annsshadow/p/5037667.html\
5.sql优化主要是优化索引。
6.explain字段:
id(表的读取顺序):查询序列号,执行select子句或操作表的顺序。(id相同自上向下,id不同,值越大越先执行。)
select_type(数据读取操作的操作类型):simple:简单的select查询,查询中不包含子查询和union。
primary:包含子查询的最外层查询。
subquery:子查询
derived:衍生表(临时表)
union:若第二个select出现在union之后,则被标记为union。
union result:从union表获取结果的select。
table(这行数据是哪张表的):
type(访问类型):性能从好到差:system--const--eq_ref--ref--range--index--all(全表扫描)
优化至少要达到range级别,最好是ref。
system:系统表,很少见。单表且一行记录。
const:通过一次索引就可查询到,只匹配一行数据,如primary和unique索引的比较查询(主键在where列表中)。
select * from table where id = 1;
eq_ref:唯一性索引扫描(只有一行数据)。
select * from t1,t2 where t1.id = t2.id;
ref:非唯一性索引扫描(多行数据)。
【Mysql学习笔记】
文章图片
range:范围查询。如between、<、>、in。
index(全索引扫描):index和all的区别为index只遍历树。
select id from table;
all:全磁盘扫描。
key:实际用到的索引,如果是覆盖索引,仅出现在key列中,不会出现在possible_key中。如index索引。
key_len:索引中使用的字节数。由表定义计算得到(理论上查询条件越精确长度越长)。
ref:显示索引的哪一列被使用了,有可能是一个const。
rows:找到所需记录需要读取的行数(大致估算值)。
extra:包含不适合在其他列中显示,但十分重要的额外信息。
using filesort:mysql使用外部索引排序,无法利用索引来完成文件排序。
using temporary:使用了临时表保存中间结果,mysql对查询结果排序时使用临时表。常见于order by和group by。
using index:如果同时出现using where,表明索引被用来执行索引键值的查找,如果没有同时出现using where表明索引用来
读取数据而非执行查找动作。
覆盖索引(索引覆盖):不用回表进行查找。
using join buffer:使用了连接缓存。
impossible:where子句的值总是false,不能用来获取任何元祖。
select tables optimized away:
distinct:优化distinct操作,找到第一个匹配元祖后立即返回。
7.mysql锁机制
按数据类型分为读锁和写锁:
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会受影响。
写锁(排他锁):当前写操作没有完成前,会阻断其他写锁和读锁。
页锁:
表锁(偏读):
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
查看表上的锁,show open tables;myisam的读写调度是写优先,这也是myisam不适合做写为主表的引擎。
分析表锁定:show status like 'table%';
Table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数。
Table_locks_waited:出现表级锁定争用而发生的等待次数,此值高说明存在着较严重的表级锁争用情况。
释放表锁,onlock tables;
myisam和innodb最大的区别,事务和行级锁。
手动增加表锁:lock table 表名 read(write),表名2 read(write),其他;
session1增加读锁,session1可以读取该表,不能修改该表,不能读其它表。
session2可以读取该表,修改该表会进入阻塞,可以操作其它表。
session1增加写锁,session1可以读取该表,可以修改该表,不能读其它表。
session2读取该表会阻塞(有可能从缓存中成功取到数据)。
myisam在select之前,会自动给涉及的表加读锁,在增删改前,会自动加写锁。
行锁(偏写):
偏向innodb引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度最高。
无索引行锁会升级表锁。
类型转换会导致索引失效,sql语句中varchar类型字段一定要加单引号。
锁定一行数据:
begin;锁定之后,其它session对该行的操作将会阻塞,直到该session执行commit操作。
select * from table where id = 1 for update;
......
commit;
分析行锁定:
show status like 'innodb_row_lock%';优化建议:
innodb_row_lock_current_watis:当前正在等待锁的数量。
innodb_row_lock_time:系统启动后到现在总共等待的时间。
innodb_row_lock_time_avg:每次等待锁花的平均时间。
innodb_row_lock_time_max:等待锁最长的一次等待时间。
innodb_row_lock_watis:系统启动后到现在总共等待的次数。
文章图片
间隙锁(属于行锁):
在真正的系统中最好使用逻辑删除,不要使用物理删除,以保证数据的连贯性。
页锁:
开销和加锁时间界于表锁和行锁之间;会出现死锁,并发力度一般。
8.主从复制:
复制的基本原理:
slave会从master读取binlog来进行数据同步。
文章图片
复制的基本原则:
mysql版本最好一致;
每个slave只能有一个master;
每个slave只能有一个唯一的服务器id;
每个master可以有多个slave。
复制的最大问题:延时。
9.性能调优:
sql执行慢一般是cpu复杂运算或磁盘io次数多。
(1):慢日志查询;
slow_query_log
(2):Show Profile;
只保留15行。
mysql提供的可以用来分析当前会话中语句执行的资源消耗情况的工具。默认关闭。
set profiling = on; 开启命令。
show profile; 显示sql执行消耗时间的列表。
show profile cpu,block io for query 1; (参数all显示所有的信息)
文章图片
group by查询容易产生临时表。
(3):全局查询日志。
只用于测试,千万不要在生产环境开启。
set global general_log = 1;
select * from mysql.general_log;