1)关联更新:update A,B set A.c1=B.c1,A.c2=B.c2 where A.id=B.id
update A inner join B ON A.id=B.id SET A.c1=B.c1,A.c2=B.c2 where ...
Mysql查询优化考点
1)查找分析查询速度慢的原因
2)优化查询过程中的数据访问
3)优化长难的查询语句
4)优化特定类型的查询语句
一、分析SQL查询慢的方法
1)记录慢查询日志
2)分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,可以使用pt-query-digest工具进行分析
使用show profile
set profiling =1; 开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中。
show profiles
show profile for query 临时表ID
使用show status
show status会返回一些计数器,show global status查看服务器级别的所有计数
有时根据这些计数,可以猜测出哪些操作代价较高或者消耗时间多
show processlist
观察是否有大量线程处于不正常的状态或者特征
使用explain分析单条sql语句
二、优化查询过程中的数据访问
1)访问数据太多导致查询性能下降
2)确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
3)确认mysql服务器是否在分析大量不必要的数据行
避免使用如下sql语句
1)查询不需要的记录,使用limit解决
2)多表关联返回全部列,指定A.id,A.name,B.age
3)总是取出全部列,SELECT * 会让优化器无法完成索引覆盖扫描的优化
重复查询相同的数据,可以缓存数据,下次直接读取缓存
是否在扫描额外的记录
使用explain来进行分析,如果发现查询需要扫描大量的数据单只返回少数的行,可以通过如下技巧进行优化:
1)使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果。
2)改变数据库和表的结构,修改数据表的范式
3)重新SQL语句,让优化器可以以更优的方式进行查询
三、优化长难的查询语句
一个复杂查询还是多个简单查询
MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多。
使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询也是很有必要的,方便做缓存
切分查询
将一个大的查询分为多个小的相同查询;一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器的开销。
分解关联查询
可以将一条关联语句分解成多条SQL来执行,让缓存的效率更高。
执行单个查询可以减少锁的竞争
在应用层做关联可以更容易对数据库进行拆分
四、优化特定类型的查询语句
1)优化count()查询
count(*)中的×会忽略所有的列,直接统计所有的列数,因此不要使用count(列名)
MyISAM中,没有任何where条件的count(*)非常快