mysql优化
mysql优化
请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语
句性能如何分析?
考官考点
查找分析查询速度慢的原因
优化查询过程中的数据访问
优化长难的查询语句
优化特定类型的查询语句
分析SQL查询慢的方法
记录慢查询日志
分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费
时间和精力,可以使用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语句
优化查询过程中的数据访问
避免使用如下SQL语句
查询不需要的记录,使用limit解决
多表关联返回全部列,指定A.id,A.name,B.age
总是取出全部列,SELECT*会让优化器无法完成索引覆盖扫描的
重复查询相同的数据,可以缓存数据,下次直接读取缓存
是否在扫描额外的记录
使用explain来进行分析,如果发现查询需要扫描大量的数据但只
返回少数的行,可以通过如下技巧去优化:
使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不
需要回表获取对应行就可以返回结果
改变数据库和表的结构,修改数据表范式
重写SQL语句,让优化器可以以更优的方式执行查询
一个复杂查询还是多个简单查询
MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数
据给客户端就要慢得多
使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个
小的查询是很有必要的
切分查询
将一个大的查询分为多个小的相同的查询
一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加
损耗服务器开销
分解关联查询
可以将一条关联语句分解成多条SQL来执行
让缓存的效率更高
执行单个查询可以减少锁的竞争
在应用层做关联可以更容易对数据库进行拆分
优化count()查询
count()中的会忽略所有的列,直接统计所有列数,因此不要使
用count(列名)
MyISAM中,没有任何WHERE条件的count()非常快
当有WHERE条件,MyISAM的count统计不一定比其他表引擎快
可以使用explain查询近似值,用近似值替代count()
增加汇总表
使用缓存
优化关联查询
确定ON或者USING子句的列上有索引
确保GROUP EY和ORDERBY中只有一个表中的列,这样MySQL
才有可能使用索引
优化子查询
尽可能使用关联查询来替代
优化GROUP BY和DISTINCT
这两种查询均可使用索引来优化,是最有效的优化方法
关联查询中,使用标识列进行分组的效率会更高
如果不需要ORDERBY,进行GROUP BY时使用ORDER BY
NULL,MySQL不会再进行文件排序
优化LIMIT分页
LIMIT偏移量大的时候,查询效率较低
可以记录上次查询的最大ID,下次查询时直接根据该ID来查询
优化UNION查询
UNION ALL的效率高于UNION
请简述一下数据库的优化?
1.从结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离
2.从储存层: 采用合适的存储引擎,采用三范式
3.从设计层: 采用分区分表,索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysql缓存
4.sql语句层:结果一样的情况下,采用效率高,速度快节省资源的sql语句执行