MySql知识汇总

一、索引:

1、覆盖索引:当sql语句的所求查询字段(select列)和查询条件字段(where子句)全都包含在一个索引中,可以直接使用索引查询而不需要回表。这就是覆盖索引,通过使用覆盖索引,可以减少搜索树的次数,是常用的性能优化手段。例如单表5千万条数据,如果要查询用户的年龄(age)、姓名(name)、性别(sex),那就简历表主索引,然后(age、name、sex)建立联合索引,sql语句:select age,name,sex from user where uid = 358980 即可;

2、联合索引:多个字段合并以最左原则来设计,例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效

(1)    select * from myTest  where a=3 and b=5 and c=4;----  abc顺序

abc三个索引都在where条件里面用到了,而且都发挥了作用

(2)    select * from myTest  where  c=4 and b=6 and a=3;

where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样

(3)    select * from myTest  where a=3 and c=7;

a用到索引,b没有用,所以c是没有用到索引效果的

(4)    select * from myTest  where a=3 and b>7 and c=3;---- b范围值,断点,阻塞了c的索引

a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引

(5)    select * from myTest  where b=3 and c=4; --- 联合索引必须按照顺序使用,并且需要全部使用

因为a索引没有使用,所以这里 bc都没有用上索引效果

(6)    select * from myTest  where a>4 and b=7 and c=9;

a用到了  b没有使用,c没有使用

(7)    select * from myTest  where a=3 order by b;

a用到了索引,b在结果排序中也用到了索引的效果,a下面任意一段的b是排好序的

(8)    select * from myTest  where a=3 order by c;

a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使用 explain 可以看到 filesort

(9)    select * from mytable where b=3 order by a;

b没有用到索引,排序中a也没有发挥索引效果

索引失效条件:

不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

存储引擎不能使用索引范围条件右边的列

尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *

mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描

is null,is not null也无法使用索引  ----  此处存在疑问,经测试确实可以使用,ref和const等级,并不是all

like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的操作。问题:解决like‘%字符串%’时索引不被使用的方法?用覆盖索引就是查询字段是索引类型

3、索引下调:就是where username like ‘张%’ and id>10 先查ID大于10 ,再查username

索引缺点:

第一,   创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

第二,   索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

第三,   当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

二、explain慢查询

1、关键参数type:

system最好,到ref,一般就认为达标了。

ALL和index最差,必须要进行优化。

2、关键参数 possible_keys, key,key_len

possible_keys: 表示可能用到的索引,如果为空,没有可能的索引

key: 表示实际用到的索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

3、关键参数extra

一般而言,出现Using filesortUsing temporary就需要进行优化了。

Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。

Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。

Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。

Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。

三、Mysql事务

事务的特性

a原子性、c一致性、i隔离性、d持久性

事务隔离级别:

ru 能读到未提交(会出现脏读)

rc 能读已提交 (同一事务同一sql,运行有先后,读到不一样)

rr 可重复读,(数据在事务中读取一致)

串行,通常不用

四、Mysql同步方案

1、异步复制 :就是正常传统的主从复制,缺点1)当业务并发上来时,slave因为要顺序执行master批量事务,导致很大的延迟;2)slave因为网络不稳定,一直没有收到t1;master挂掉,slave提升为新的master,t1丢失

2、半同步复制:添加了ack(消息确认)要么至少一个从库节点通知它已经收到了所有这个事务的Binlog事件,要么一直等待直到超过配置的某一个时间点为止,而此时,半同步复制将自动关闭,转换为异步复制。MySQL 5.7版本中更增加了after_sync(无损复制)参数,并将其设置为默认半同步方式,解决了数据丢失的问题。

五、Mysql备份

冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;

温备(warm backup): 服务在线,但仅支持读请求,不允许写请求;

热备(hot backup):备份的同时,业务不受影响。

有全量备份和增量备份xtrabackup+binglog实现增量备份

你可能感兴趣的:(MySql知识汇总)