Mysql架构和历史

逻辑架构

Mysql高性能总结

并发控制

锁分类:

共享锁 读锁

排它锁 写锁

锁策略:

表级锁

行级锁

注:存储引擎自己实现锁机制

事务

ACID理解:原子性、一致性、隔离性、持久性

隔离级别:

         RU(读未提交):脏读、不可重复读、幻读

         RC(读已提交):不可重复读、幻读

         RR(可重复读):幻读

         S(可串行化):加锁读

注:Mysql默认隔离级别为:RR,通过mvcc(多版本控制)解决幻读

         事务是由存储引擎实现的

死锁

死锁是两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

注:Innodb处理死锁的方法是,将持有最少行级排它锁的事务进行回滚

数据类型与Schema优化

数据类型的选择

    1. 更小的通常更好
    2. 简单更好
    3. 尽量避免NULL

举例:

使用Mysql内建的类型而不是字符串存储日期和时间

用整型存储IP地址       

尽量避免使用null,索引字段不能为NULL

DATETIME和TIMESTAMP的区别

Schema的设计

         避免太多的列(宽表)

         避免太多的关联

         枚举少用

         尽量避免使用null

         范式和反范式相结合

创建高性能的索引

在mysql中索引是在存储引擎层而不是在服务器层实现的,且各存储引擎对相同索引的实现也不一样

数据和索引的统计信息放在存储引擎中

索引分类

         底层实现:

B-Tree索引

                   哈希索引

                   …

         功能:

                   主键索引

                   普通索引

                   唯一索引

                   组合索引

索引的优点

    1. 大大减少了服务器需要扫描的数据量
    2. 可以帮助服务器避免排序和临时表
    3. 可以将随机I/O变为顺序I/O

索引策略

         独立的列(不能是表达式的一部分或函数的参数)

最左前缀和索引选择性

         聚簇索引

         Mysql高性能总结

覆盖索引

 

使用索引扫描来做排序

 

冗余和重复索引

 

索引和锁

         InnoDB在二级索引上使用共享(读)锁,但在主键索引上使用排它(写)锁

 

总结

         单行访问是很慢的

         按顺序访问范围数据是很快的

         索引覆盖查询是很快的

查询性能优化

优化数据访问

         是否向数据库请求了不需要的数据

         是否在扫描额外的记录

重构查询的方式

         复杂查询or多个简单查询

         切分查询

         分解关联查询

查询执行的基础

Mysql高性能总结

  1. Mysql客户端/服务端通信协议

半双工

         查询状态 Show full processlist

                   Sleep:

                   Query:

                   Locked:

                   Analyzing and statistics:

                   Copying to tmp table:

                   Sorting result:

                   Sending data:

  1. 查询缓存

通过对一个大小写敏感的哈希查找实现的

  1. 查询优化处理

语法解析器:校验语法

预处理器:校验字段、

查询优化器:将语法树转化成执行计划,是一个很复杂的过程

  1. 查询执行引擎

 

  1. 返回结果给客户端

查询优化器的局限性

 

查询优化器的提示

 

优化特定类型的查询

 

未完待续

转载于:https://my.oschina.net/jzgycq/blog/1931880

相关文章: