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(*)非常快
mysql的sql语句编写和优化
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...