29.实战之MYSQL优化

分析过程大概如下:

29.实战之MYSQL优化

实战中呢:

     2章 SQL语句优化

本章主要介绍SQL语句优化的相关知识

·         2-1 数据准备 (02:49)

·         2-2 MySQL慢查日志的开启方式和存储格式 (05:54)

·         2-3 MySQL慢查日志分析工具之mysqldumpslow (04:32)

·         2-4 MySQL慢查日志分析工具之pt-query-digest (07:00)

·         2-5 如何通过慢查日志发现有问题的SQL (02:47)

·         2-6 通过explain查询和分析SQL的执行计划 (04:09)

·         2-7Count()和Max()的优化 (07:02)

·         2-8 子查询的优化 (03:21)

·         2-9 groupby的优化 (03:42)

·         2-10 Limit查询的优化 (06:06)

3章 索引优化

本章主要介绍如何选择合适的列创建索引,以及索引的维护方法。

·         3-1 如何选择合适的列建立索引 (03:25)

·         3-2 索引优化SQL的方法 (07:17)

·         3-3 索引维护的方法 (02:43)

4章 数据库结构优化

本章主要讲解数据库结构对于数据库优化的重要性,以及如何设计出一个结构清晰且高效的数据库结构。

·         4-1 选择合适的数据类型 (06:43)

·         4-2 数据库表的范式化优化 (05:03)

·         4-3 数据库表的反范式化优化(提升读效率) (04:23)

·         4-4 数据库表的垂直拆分 (02:59)

·         4-5 数据库表的水平拆分 (03:13)

5章 系统配置优化

本章主要介绍了系统配置对MySQL优化的影响,对比较重要的一些参数进行了着重的介绍。

·         5-1 数据库系统配置优化 (04:24)

·         5-2 MySQL配置文件优化 (10:26)

·         5-3 第三方配置工具使用 (06:17)

6章 服务器硬件优化

本章简单介绍的服务器硬件对MYSQL优化的影响,以及如何选择CPU及内存以提供更好的服务器性能。

 6-1 服务器硬件优化 (05:59)

还可以从:分库分表,缓存等进行优化。


29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化

如何优化max()

seseMAX() 函数

MAX 函数返回一列中的最大值。NULL 值不包括在计算中。

29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化


 

再来一次:

         索引是数据结构,排序好的快速查找数据结构,B+tree

索引不是一朝一夕可以建好的,而是要人为的一点点去优化好。

       索引不仅为查找快,还是排序好的。所以不只是where经常用的要索引,order by用于排序的,建立索引会使得访问速度大大的提升。

       Explain关键字可以模拟优化器执行mysql查询语句,知道mysql如何处理你的sql语句。分析查询语句或者表结构的性能瓶颈。

 

ID

29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化

Id相同,执行顺序从上到下。

Id不同,执行顺序从大到小执行。

Id相同不同,先大序号,再相同序号的上到下。

 

SELECT_TYPE

29.实战之MYSQL优化

29.实战之MYSQL优化

SIMPLE:最简单的查询,不包含子查询或者union(包含连接查询)

PRIMARY:查询如果有任何复杂的子部分,最外围一层则是PRIMSRY,里层则是SUBQUERY

DERIVER:在from列表中临时查询的表。

UNION:使用到UNION,则第二个select的表被标记为UNION

UNION Result:从UNION表获取结果的SELECT,即合并的最后结果表。

29.实战之MYSQL优化29.实战之MYSQL优化

SYSTEM:查询的表只有一条记录。

CONST:常量查询,一定只有一条数据的,用于比较primay key或者unique索引,单表中最多有一个匹配行,查询起来非常迅速,只匹配一次。


29.实战之MYSQL优化

eq_refref。对于每个索引键,查的表记录只有唯一记录与之对应,但是可能匹配多个索引键,则不是const,而是eq_ref,eq_ref一个索引键匹配一条表记录,比如用主键或者唯一索引查询的,是eq_ref。而ref是用到了索引然后匹配表记录的结果是非唯一的,返回某个匹配的单独值的所有记录。

29.实战之MYSQL优化

Ranger:用到索引,范围搜索。

 29.实战之MYSQL优化

Index:用到索引,全表扫描。

ALL,全表混乱结构,扫描。

 

优化效果:

System>const>eq_ref>ref>range>index>all29.实战之MYSQL优化

Possible_keys:理论索引,则扫描中扫到的索引。可能会用到的索引。

Key:实际用索引。查询中如果用到覆盖索引,则直接在key上显示。所以以key为准即可。

Key_len:根据表定义的字段的长度,显示为用到的索引字段的最大可能长度,并非实际使用的长度。29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化

Ref:用到的具体哪个索引,如上:sell数据库中,p表的order_id字段。

Rows:估计要找出记录大概有多少行被读取。

 

Extra

Extra表示附加信息,常见的有如下几种(也按查询效率从高到低排列)

·        Using index:表示使用索引,如果只有 Using index,说明他没有查询到数据表,只用索引表就完成了这个查询,这个叫覆盖索引(就是返回索引值,比如select id这样)如果同时出现Using where,代表使用索引来查找读取记录,也是可以用到索引的,但是需要查询到数据表。

·        Using where:表示条件查询,如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where如果type列是ALL或index,而没有出现该信息,则你有可能在执行错误的查询:返回所有数据。  

·        Using filesort不是“使用文件索引”的含义!filesort是MySQL所实现的一种排序策略,通常在使用到排序语句ORDER BY的时候,会出现该信息。  

·        Using temporary表示为了得到结果,使用了临时表,这通常是出现在多表联合查询,结果排序使用到了临时表,如order by和group by的场合、这意味着mysql对查询结果进行排序的时候使用了一张临时表

如果EXPLAIN出现后面两个信息(Using filesort,Using temporary),而rows又比较大,通常意味着你需要调整查询语句,或者需要添加索引,总之需要尽量消除这两个信息。

尽量用Using Index,是覆盖索引,不用去数据表找,直接在索引表就可以返回了。

索引总结(索引失效):

29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化

Like 百分号写右边。否则,

Like ‘%索引%’ 这种情况,用覆盖索引,就可以避免全表扫描。

29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化

换位置没关系。

29.实战之MYSQL优化

用了c3索引排序。C4因为c3断了,所以排序无用,filesort,要避免!下面的倒序了,排序,也是不行的。29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化

29.实战之MYSQL优化

 29.实战之MYSQL优化

Order by的索引使用情况(不能再改,要用默认的升序。)

29.实战之MYSQL优化    29.实战之MYSQL优化29.实战之MYSQL优化

慢日志查询语句,还可以通过以下的方式去统计。

29.实战之MYSQL优化Show profile 可以看出每一条sql语句的生命周期。可以分析哪里慢了。可以看出下面的产生了临时表。29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化

加锁:

29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化

MYISAM自动加表锁,不适合写锁,因为加了,会导致很多其他的阻塞。

接下来看下INNODB的行锁:加了行锁后,其他无法对该行进行写操作。

29.实战之MYSQL优化29.实战之MYSQL优化

索引失效了,行锁就变表锁了。


当Where 查询条件中的字段没有索引时,更新操作会锁住全表!

无索引时行锁升级为表锁。

所以写操作一定要注意where条件了,一定要使用索引来避免全表锁定。29.实战之MYSQL优化29.实战之MYSQL优化29.实战之MYSQL优化