mysql高性能读书笔记7

一般MySQL使用如下三种方式应用where条件,从好到坏依次:1在索引中使用where条件过滤不匹配的行,在存储引擎层完成,2使用索引覆盖扫码(在extra列出现using index)来返回记录,直径过滤不需要的记录并返回命中的结果,在MySQL服务器层完成,但是无需再回表查询,3从数据表中返回数据,然后过滤不满足条件记录(在extra列出现using where),这也是在服务器层完成,MySQL需要从数据表中读出记录然后过滤。MySQL查询执行路径:1客户端发送一条查询给服务器端,通信协议是半双工,无法进行流量控制,这时参数max_allowed_packet就很重要,来限制查询语句过长,2服务器先检查查询缓存,如果命中,立刻返回存储在缓存中的结果,如果没有进入下一阶段,3服务器解析SQL,预处理,再由优化器生成对应的执行计划,4MySQL根据执行计划调用存储引擎的api来执行查询,5将结果返回给客户端,不停的推送数据,客户端只有被动接受,不能让服务器停下来,所以有必要用limit。排序优化通过设置参数max_length_for_sort_data。使用松散索引扫描(在extra列出现using index for group-by)。使用union的时候,MySQL会给临时表加distinct选项,代价很高,union all查询速度比较快。统计更新和插入的数量:insert into table values on duplicate key uodate c1=values(c1) + (0 * (@x := @x +1));表达式乘以0来让其不影响更新的内容,@x表示更新的行数。避免重复查询刚刚更新什么的数据:update table set a=b where id=1 and @now :=NOW();select @now;通过least函数确定取值顺序,在赋值和读取变量的时候,值不是你所想,因为where和select在两个不同的阶段被执行,这时将赋值语句放到least函数中:least(0,@rownum := @rownum +1),可以在不改变排序顺序的时候完成操作,不希望对子句执行有影响又要完成赋操作,其他函数greatest,IsNull,nullifL,if,coalesce。编写偷懒的union,第一个子查询作为分支条件先执行,如果匹配到就跳过第二个分支,如果不匹配就执行第二个分支:select greatest(@found:=-1,id) as id,'users' as which_tab from users where id=1 union all select id,'users_archived' from user_archived where id=1 and @found is null union all select 1 'reset' from dual where (@found:=null) is not null;最后在末尾将变量重置为null,保证遍历时不影响后面的结果。

原文地址:https://www.cnblogs.com/nizuimeiabc1/p/12862783.html