网站注册好域名怎么办,四川城乡建设厅官网,浙江建设职业学校网站,wordpress镜像配置为什么查询速度会慢1.慢是指一个查询的响应时间长。一个查询的过程#xff1a;客户端发送一条查询给服务器服务器端先检查查询缓存#xff0c;如果命中了缓存#xff0c;则立可返回存储在缓存中的结果。否则进入下一个阶段服务器端进行SQL解析、预处理#xff0c;再由优化器…为什么查询速度会慢1.慢是指一个查询的响应时间长。一个查询的过程客户端发送一条查询给服务器服务器端先检查查询缓存如果命中了缓存则立可返回存储在缓存中的结果。否则进入下一个阶段服务器端进行SQL解析、预处理再由优化器生成对应的执行计划。MySQL根据优化器生成的执行计划调用存储引擎的API来执行查询。将结果返回给客户端2.数据访问是否向数据库请求了不需要的数据是否扫描额外的记录3.查询的方式一个复杂的查询还是多个简单的查询切分查询将大查询切分成小查询循环完成小查询分解关联查询慢查询分析问题SQL把复杂的SQL分成多个简单SQL并执行查看具体那个字段会慢区分度不高。EXPLAIN显示SQL如何使用索引的执行计划。执行计划的参数table 显示这一行的数据是关于哪张表的type 显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALLpossible_keys 显示可能应用在这张表中的索引。如果为空没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句key 实际使用的索引。如果为NULL则没有使用索引。很少的情况下MYSQL会选择优化不足的索引。这种情况下可以在SELECT语句中使用USE INDEXindexname来强制使用一个索引或者用IGNORE INDEXindexname来强制MYSQL忽略索引key_len 使用的索引的长度。在不损失精确性的情况下长度越短越好ref 显示索引的哪一列被使用了如果可能的话是一个常数rows 扫描请求数据的行数Extra 关于MYSQL如何解析查询的额外信息PROFILE显示SQL执行消耗系统资源的信息。查询执行的过程MySQL客户端/服务器通信协议是“半双工”的。客服端/服务器端都可以向对方发送数据但不能同时发生。所以我们无法也无须将一个消息切成小块独立来发送。这种协议没办法进行流量控制。客户端发送请求的数据包大小由参数max_allowed_packet限制。如果查询太大服务端会拒绝接受更多的数据并抛出相应的错误。服务器端返回的多个数据包客户端必须完整接受。1.查询状态 SHOW FULL PROCESSLIST mysqlSHOW FULL PROCESSLIST;Id User Host db Command Time State Info
------ ------ --------------- ------------ ------- ------ ------ -----------------------1 root localhost:61316 laravel_blog Query 0 (NULL) show FULL processlist 2 root localhost:61319 (NULL) Sleep 94 (NULL)对于一个连接或者说一个线程任何时刻都有一个状态该状态表示了MySQL当前正在做什么。2.查询缓存-- 查看缓存是否开启 query_cache_type 为 ON 表示已经开启
mysql show variables like %query_cache%; ----------------------------------------
| Variable_name | Value |
----------------------------------------
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 20971520 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
----------------------------------------检查sql是否命中缓存。命中则检查一次用户权限后返回这个检查是通过一个对大小写敏感的哈希查找实现的。两次查询只要有一个字节的不同就会失败。否则将进入下一个阶段。当sql中有不确定的数据时则不会被缓存。例如用户自定义函数、存储函数、用户变量、临时表、mysql库中的系统表其查询结果都不会被缓存。3.查询优化语法解析器和预处理 MySQL通过关键字将sql语句进行解析并生成一颗对应的解析树。这个过程解析器主要通过语法规则来验证和解析。比如sql中是否使用了错误的关键字或者关键字的顺序是否正确等。预处理则会根据MySQL规则进一步检查解析树是否合法。比如检查要查询的数据表和数据列是否存在等。查询优化器经过前面的步骤生成的语法树被认为是合法的了并且由优化器将其转化成查询计划。多数情况下一条查询可以有很多种执行方式最后都返回相应的结果。优化器的作用就是找到这其中最好的执行计划。MySQL使用基于成本的优化器通过计算成本选择其中最小的一个。通过SHOW STATUS LIKE Last_query_cost;查看成本。成本的最小单位是随机读取一个4K数据页的成本。MySQL的查询优化器是一个非常复杂的部件它使用了非常多的优化策略来生成一个最优的执行计划重新定义关联表的顺序将外连接转化成内连接使用等价变换规则优化count、min、max预估并转化为常数表达式覆盖索引描述子查询优化提前终止查询等值传播列表IN的比较 上面列举了一些随着MySQL的不断发展优化器使用的优化策略也在不断的进化。 查询执行引擎在完成解析和优化阶段以后MySQL会生成对应的执行计划查询执行引擎根据执行计划给出的指令逐步执行得出结果。整个执行过程的大部分操作均是通过调用存储引擎实现的接口来完成这些接口被称为handler API。查询过程中的每一张表由一个handler实例表示。实际上MySQL在查询优化阶段就为每一张表创建了一个handler实例优化器可以根据这些实例的接口来获取表的相关信息包括表的所有列名、索引统计信息等。存储引擎接口提供了非常丰富的功能但其底层仅有几十个接口这些接口像搭积木一样完成了一次查询的大部分操作。返回结果查询执行的最后一个阶段就是将结果返回给客户端。即使查询不到数据MySQL仍然会返回这个查询的相关信息比如该查询影响到的行数以及执行时间等。如果查询缓存被打开且这个查询可以被缓存MySQL也会将结果存放到缓存中。结果集返回客户端是一个增量且逐步返回的过程。有可能MySQL在生成第一条结果时就开始向客户端逐步返回结果集了。这样服务端就无须存储太多结果而消耗过多内存也可以让客户端第一时间获得返回结果。需要注意的是结果集中的每一行都会以一个满足①中所描述的通信协议的数据包发送再通过TCP协议进行传输在传输过程中可能对MySQL的数据包进行缓存然后批量发送。以上内容希望帮助到大家很多PHPer在进阶的时候总会遇到一些问题和瓶颈业务代码写多了没有方向感不知道该从那里入手去提升对此我整理了一些资料包括但不限于分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6laravelYII2RedisSwoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家需要戳这里PHP进阶架构师视频、面试文档免费获取或 者关注我每天分享技术文章PHP架构师之路www.zhihu.com