Mysql学习笔记

视频链接: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:非唯一性索引扫描(多行数据)。

                                  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;

               分析表锁定:show status like 'table%';

                      Table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数。

                      Table_locks_waited:出现表级锁定争用而发生的等待次数,此值高说明存在着较严重的表级锁争用情况。

               释放表锁,onlock tables;

               myisam的读写调度是写优先,这也是myisam不适合做写为主表的引擎。

               myisam和innodb最大的区别,事务行级锁

               手动增加表锁:lock table 表名 read(write),表名2 read(write),其他;

               session1增加读锁,session1可以读取该表,不能修改该表,不能读其它表。

                                               session2可以读取该表,修改该表会进入阻塞,可以操作其它表。

               session1增加写锁,session1可以读取该表,可以修改该表,不能读其它表。

                                               session2读取该表会阻塞(有可能从缓存中成功取到数据)。

               myisam在select之前,会自动给涉及的表加读锁,在增删改前,会自动加写锁。

       行锁(偏写):

               偏向innodb引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度最高。

               无索引行锁会升级表锁。

               类型转换会导致索引失效,sql语句中varchar类型字段一定要加单引号。

               锁定一行数据:

               begin;

               select * from table where id = 1 for update;

               ......

               commit;

               锁定之后,其它session对该行的操作将会阻塞,直到该session执行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:系统启动后到现在总共等待的次数。

               优化建议:

Mysql学习笔记_第1张图片
      

               间隙锁(属于行锁):

               在真正的系统中最好使用逻辑删除,不要使用物理删除,以保证数据的连贯性。

       页锁:

              开销和加锁时间界于表锁和行锁之间;会出现死锁,并发力度一般。

8.主从复制:

       复制的基本原理:

              slave会从master读取binlog来进行数据同步。

Mysql学习笔记_第2张图片

       复制的基本原则:

              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显示所有的信息)

Mysql学习笔记_第3张图片

               group by查询容易产生临时表。

       (3):全局查询日志。

              只用于测试,千万不要在生产环境开启。

              set global general_log = 1;

              select * from mysql.general_log;

             

 

 

 

 

 

 

 

 

 

 

 

 

      

你可能感兴趣的:(Mysql学习笔记)