29.实战之MYSQL优化
分析过程大概如下:
实战中呢:
2章 SQL语句优化
本章主要介绍SQL语句优化的相关知识
· 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)
3章 索引优化
本章主要介绍如何选择合适的列创建索引,以及索引的维护方法。
· 3-2 索引优化SQL的方法 (07:17)
4章 数据库结构优化
本章主要讲解数据库结构对于数据库优化的重要性,以及如何设计出一个结构清晰且高效的数据库结构。
· 4-3 数据库表的反范式化优化(提升读效率) (04:23)
5章 系统配置优化
本章主要介绍了系统配置对MySQL优化的影响,对比较重要的一些参数进行了着重的介绍。
6章 服务器硬件优化
本章简单介绍的服务器硬件对MYSQL优化的影响,以及如何选择CPU及内存以提供更好的服务器性能。
6-1 服务器硬件优化 (05:59)
还可以从:分库分表,缓存等进行优化。
如何优化max()
seseMAX() 函数
MAX 函数返回一列中的最大值。NULL 值不包括在计算中。
再来一次:
索引是数据结构,排序好的快速查找数据结构,B+tree
索引不是一朝一夕可以建好的,而是要人为的一点点去优化好。
索引不仅为查找快,还是排序好的。所以不只是where经常用的要索引,order by用于排序的,建立索引会使得访问速度大大的提升。
Explain关键字可以模拟优化器执行mysql查询语句,知道mysql如何处理你的sql语句。分析查询语句或者表结构的性能瓶颈。
ID
Id相同,执行顺序从上到下。
Id不同,执行顺序从大到小执行。
Id相同不同,先大序号,再相同序号的上到下。
SELECT_TYPE
SIMPLE:最简单的查询,不包含子查询或者union(包含连接查询)
PRIMARY:查询如果有任何复杂的子部分,最外围一层则是PRIMSRY,里层则是SUBQUERY
DERIVER:在from列表中临时查询的表。
UNION:使用到UNION,则第二个select的表被标记为UNION。
UNION Result:从UNION表获取结果的SELECT,即合并的最后结果表。
SYSTEM:查询的表只有一条记录。
CONST:常量查询,一定只有一条数据的,用于比较primay key或者unique索引,单表中最多有一个匹配行,查询起来非常迅速,只匹配一次。
eq_ref与ref。对于每个索引键,查的表记录只有唯一记录与之对应,但是可能匹配多个索引键,则不是const,而是eq_ref,eq_ref一个索引键匹配一条表记录,比如用主键或者唯一索引查询的,是eq_ref。而ref是用到了索引然后匹配表记录的结果是非唯一的,返回某个匹配的单独值的所有记录。
Ranger:用到索引,范围搜索。
Index:用到索引,全表扫描。
ALL,全表混乱结构,扫描。
优化效果:
System>const>eq_ref>ref>range>index>all
Possible_keys:理论索引,则扫描中扫到的索引。可能会用到的索引。
Key:实际用索引。查询中如果用到覆盖索引,则直接在key上显示。所以以key为准即可。
Key_len:根据表定义的字段的长度,显示为用到的索引字段的最大可能长度,并非实际使用的长度。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,是覆盖索引,不用去数据表找,直接在索引表就可以返回了。
索引总结(索引失效):
Like 百分号写右边。否则,
Like ‘%索引%’ 这种情况,用覆盖索引,就可以避免全表扫描。
换位置没关系。
用了c3索引排序。C4因为c3断了,所以排序无用,filesort,要避免!下面的倒序了,排序,也是不行的。
Order by的索引使用情况(不能再改,要用默认的升序。):
慢日志查询语句,还可以通过以下的方式去统计。
加锁:
MYISAM自动加表锁,不适合写锁,因为加了,会导致很多其他的阻塞。
接下来看下INNODB的行锁:加了行锁后,其他无法对该行进行写操作。
索引失效了,行锁就变表锁了。
当Where 查询条件中的字段没有索引时,更新操作会锁住全表!
无索引时行锁升级为表锁。
所以写操作一定要注意where条件了,一定要使用索引来避免全表锁定。