Mysql: Binlog、主从同步和SQL优化

binlog

binLog是什么

    MySQL的二进制日志binlog记录了所有的DDL、DCL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的

        binLog 作用

                1.mysql 通过binLog将master数据同步至slave

                2.通过mysqlbinlog工具来恢复数据

DDL(数据库定义语言)

    主要的命令有create、alter、drop等,ddl主要是用在定义或改变表(table)的结构,数据类型,表之间的连接和约束等初始工作上,他们大多在建表时候使用

DML(数据库操纵语言)

    主要命令是slect,update,insert,delete,就像它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言

DCL(Data Control Language)数据库控制语言

    是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句

主从同步

1.Slave开启两个线程,其一线程向Master请求从上次同步位置以后offset的binlog。然后,等待Master返回binlog后,其二线程将binlog记录的事件执行一次,并记录该次同步到哪个位置

2.Master也很简单,开启dump线程,等待Slave的请求,接到请求后,有了上次同步位置offset,就查询offset后的binlog,返回给Slave 


如何识别慢SQL

1.查看 SQL执行频率:show status like 'Com_%';

     Com_select:执行SELECT操作的次数,一次查询累加1      

       Innodb_rows_read:SELECT查询操作插入的行数       

       Innodb_rows_inserted/updated/deleted:执行INSERT/UPDATE/DELETE操作的行数  

2.定位执行效率比较低的SQL

    通过慢查询日志定位慢SQL,用--log-slow-queries[=file_name]选项启动时,mysqld会写一个所有执行时间超过long_query_time秒的SQL语句的日志文件

     使用SHOW FULL PROCESSLIST; 查看当前MySQL在进行的线程,同时对一些锁表操作进行优化

3.通过EXPLAIN 分析慢SQL

    select_type:表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等

     table:输出结果的表名

    type:表示MySQL在表中找到所需行的方式,或者叫访问类型 ;常见的有:ALL index range ref eq_ref const,system NULL,从左到右,性能由最差到最好

             type=ALL:全表扫描

              type=index:索引全扫描,MySQL遍历整个索引来查询

              type=range:索引范围扫描,常见于<、<=、>、 >=、 between

               type=ref:使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录

               type=eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者unique index作为关联条件

               type=const/system:单表中最多有一个匹配行,查询起来非常迅速,一般主键primary key或者唯一索引unique index进行的查询,通过唯一索引uk_email访问的时候,类型type为const;而从我们构造的仅有一条记录的a表中检索时,类型type为system

               type=NULL:MySQL不用访问表或者索引,就能直接得到结果

         possible_keys:表示查询时可能使用的索引 

         key:表示实际使用的索引

         key_len:使用到索引字段的长度

         rows:扫描行的数量

         Extra:执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息

         Using where:表示优化器除了利用索引来加速访问之外,还需要根据索引回表查询数据。 

索引

普通索引:最基本的索引,没有任何限制,我们大多数情况下使用到的索引

主键索引:不允许为空

唯一索引:与普通索引不同的是,唯一索引的列值必须唯一,但是允许为空值

组合索引:将几个列作为一条索引进行检索,适用最左匹配原则

全文索引:仅适用于MyISAM引擎的数据表;作用于CHAR,VARCHAT,TEXT数据的列

优点

    唯一和主键索引可保证数据唯一性

    索引可以提高检索速度和减少表的检索行数

    索引可以提高查询性能

缺点

    当对表进行insert、update、delete时索引也要动态维护

    索引会占用物理空间

    创建和维护索引会耗时,随着数据量增加而增加


SQL 优化

尽量避免在 where 子句中使用 > < != 操作符,否则数据库引擎将放弃索引使用全表扫描

尽量避免在 where 子句中使用 or 条件(可以使用 union 来代替or连接查询结果)

慎用 in 和 not in。对于一组连续的数据,可以使用 between代替。或者可以考虑使用 exists 代替 in

like %aaa% 语句会导致全表扫描。除非使用全文索引

尽量避免在 where 子句中进行表达式操作,这将导致放弃索引使用全表扫描

任何地方都不要使用 select * from table ,查询应该指定具体的字段来代替 *,不要返回用不到的字段。全表扫描

对于连续的值尽量使用between 代替in

#{xx} 传入值时添加“”   ${}插入值时没有双引号

mysql 会对group by 进行一次排序  默认不需要则可以设置 order by null

数据类型出现隐式转换时不会使用索引

用or分开的条件,如果or前的列有索引后面没有索引则不使用索引

order by 混合 ASC DESC 不使用索引

对不同关键字进行order by 不使用索引

子查询应该被join代替

你可能感兴趣的:(Mysql: Binlog、主从同步和SQL优化)