失效链接处理 |
mysql优化1 PDF 下载
本站整理下载:
提取码:b44u
相关截图:
主要内容:
一:
1 .查询是否开启慢查询日志
show variables like 'slow_query_log';
2 设置慢查询日志位置
set global slow_query_log_file= 'D:/mysql/sql_log/mysql-slow.log';
3 记录未使用索引的查询
set global log_queries_not_using_indexes=on;
4 将查询时间大于1s 的查询写入日志
set global long_query_time=1;
二. max() count() 可以为字段建立覆盖索引 比如
SELECT count(release_year='2006' OR NULL) AS '2006年电影数量',count(release_year='2007' OR NULL) as '2007年电影数量' from film ;
三.子查询优化:子查询可以改为jion的关联查询语句。
Select t.id from t where t.id in (select t1.id from t1); //子查询
select DISTINCT t.id from t JOIN t1 on t.id=t1.id // join 关联查询
四. Group by 语句的优化
4.1 优化前
EXPLAIN SELECT actor.first_name,actor.last_name, count(*)
from film_actor INNER JOIN actor using(actor_id)
GROUP BY film_actor.actor_id ;
4.2 优化后
Explain Select actor.first_name,actor.last_name , c.cnt from actor inner join (
Select actor_id,count(*) as cnt from film_actor group by actor_id
) as c using(actor_id);
五 Limit 查询的优化
5.1 优化前
Select film_id, description from film order by title limit 50 ,5;
5.2 优化后
优化方式一:使用有索引的列或者主键进行order by 操作
Select film_id ,description from film order by film_id limit 50,5;
优化方式二: 记录上次返回的主键,在下次查询时使用主键过滤。
避免了数据量大时扫描过多的记录
explain select film_id,description from film WHERE film_id>50 and film_id<=55 ORDER BY film_id limit 1,5 \G;
六. 索引的优化
如何选择合适的列建立索引?
1.在where 从句 group by 从句,order by 从句,on 从句中出现列 最好建(覆盖索引)
2.索引字段越小越好。
3.离散度大的列放到联合索引的前面
例子:
SELECT * from payment where staff_id=2 and customer_id=584;
是 index (staff_id,customer_id) 好?还是index(customer_id,staff_id) 好呢?
由于customer_id 的离散度更大,所以使用index(customer_id,staff_id)
判断离散度的语句.
Select count (distinct customer_id),count(distinct staff_id) from payment;
Count(customer_id )=599 count(staff_id) =2 由于599>2 所以选择customer_id
索引的优缺点:
增加索引可以加快查询效率但是会影响 insert update delete
索引的优化:删除重复以及冗余索引
|