2019-11-08

今天晴天,起晚了一点,九点到公司。

mysql如果遇到了古怪的问题,可以尝试运行check table 来检查是否发生了表损坏。check table 通常能够找出大多数的表和索引错误。

mysql的查询优化器会通过两个api来了解存储引擎的索引值分布情况,以决定是否使用索引。                                             (1)records_in_range() 通过向存储引擎传入两个边界值获取在这个范围大约有多少条记录。                                          (2)info(),返回各种类型的数据,包括索引的基数(每个键值有多少记录)

ANALYZE TABLE 命令来重新生成统计信息解决信息不正确出现错误决定的情况。

通过 SHOW INDEX FROM 命令来查看索引的基数

如果想要找到那些索引不是很符合的查询,并在他们成为问题前进行优化,则可以使用pt-query-digest的查询审查“review”功能分析其EXPLAIN出来的执行计划。https://blog.csdn.net/xiaoweite1/article/details/80299754

一般MYSQL能够使用如下三种方式应用 WHERE条件,从好到坏依次为:                                                                                (1)在索引中使用where 条件来过滤不匹配的记录。这是在存储引擎层完成的                                                             (2)使用索引覆盖扫描(在Extra列中出现Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在Mysql 服务器层完成的,但无须再回表查询记录。                                                                                        (3)从数据表中返回数据,然后过滤不满足条件的记录(在Extra列中出现Using Where)。这在Mysql 服务器层完成,Mysql需要先从数据表读出记录然后过滤。


一条SQL的执行流程:

1客户端发送一条查询给服务器

2服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。

3服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。

4Mysql 根据优化器生产的执行计划,调用存储引擎的API来执行查询。

5将结果返回给客户端。

查询状态:             

通过SHOW FULL PROCESSLIST命令查看mysql连接的状态

 Sleep线程正在等待客户端发送新的请求

 Query线程正在执行查询或则正在将结果发送给客户端

 Locked在Mysql服务器层,该线程正在等待表锁。在存储引起级别实现的锁,如InnoDB的行锁,并不会体现在线程状态中。对于MyISAM来说这是一个比较典型的状态,但在其他没有行锁的引擎中也经常会出现。                                                          Analyzing and statistics  线程正在收集尊处引擎的统计信息,并生成查询的执行计划。                                                                                                                                Copying to tmp table[on disk]线程正在执行查询,并且将其结果集都复制到一个临时表中,这个状态一般要么是在GROUP BY操作,要么是文件排序操作,或则是UNION操作。如果这个状态后面还有“on disk”标记,那表示Mysql正在将一个内存临时表放到磁盘中。                                                                                                    String result线程正在对结果集进行排序                                                                                                                                    Sending data这表示多种情况,线程可能在多个状态之间传送数据,或则在生成结果集,或则在向客户端返回数据。

查询优化器。通过Last_query_cost的值来得知Mysql计算的当前查询的成本                    例如:select SQL_NO_CACHE count(*)  from user                                                      show Status like‘Last_query_cost’

推荐阅读更多精彩内容