mysql优化 学习笔记

前言

优化mysq 学习笔记 视频位置
慕课–性能优化mysql

一 SQL 改写优化

慢查询日志用于记录 那些查询比较慢的查询记录

show variables like ‘slow_query_log’
上面的查看慢查询日志是否开启

下面的这个可以查询慢查询日志相关的其他信息
show variables like ‘slow%’

explain + sql语句用于分析这条sql的执行过程

explain select max(payment_date) from payment;

执行结果

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEpaymentNULLALLNULLNULLNULLNULL16086100NULL

向payment_date上添加一个索引 会大大的缩短搜索的时间

create index idx_paydate on payment(payment_date);

执行结果

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLENULLNULLNULLNULLNULLNULLNULLNULLNULLSelect tables optimized away

下面的Extra中表示 查询这个表中的最大数据不用再遍历整个表,直接取出最大的数据,提高查询速度

count/group优化

count(*)和count(file)是不一样的 后面的要忽略null 前面的不会忽略null

count的优化也可以通过添加索引来提高性能

子查询最好用连接来代替

group()查询优化

 select actor.first_name,actor.last_name,count(*) from sakila.film_actor inner join sakila.actor USING(actor_id) group by film_actor.actor_id;
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEactorNULLALLPRIMARYNULLNULLNULL200100Using temporary; Using filesort
1SIMPLEfilm_actorNULLrefPRIMARY,idx_fk_film_idPRIMARY2sakila.actor.actor_id27100Using index

优化后的SQL

SELECT actor.first_name, actor.last_name,c.cnt FROM sakila.actor INNER JOIN 
(SELECT actor_id, COUNT(*) AS cnt FROM sakila.film_actor GROUP BY actor_id) AS c USING(actor_id);
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1PRIMARYactorNULLALLPRIMARYNULLNULLNULL200100NULL
1PRIMARYNULLref2sakila.actor.actor_id27100NULL
2DERIVEDfilm_actorNULLindexPRIMARY,idx_fk_film_idPRIMARY4NULL5462100Using index

额外关于USING 用于简化join

SELECT f.color, c.is_primary, c.is_dark, c.is_rainbow    
FROM flags f  
INNER JOIN color c ON f.color = c.color    
WHERE f.country = 'China'; 

上面的等价于下面的

SELECT f.color, c.is_primary, c.is_dark, c.is_rainbow  
FROM flags f  
INNER JOIN color c USING(color)  
WHERE f.country = 'China'

limit 查询优化

explain select film_id,description from sakila.film order by title LIMIT 50,5;

分析结果

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEfilmNULLALLNULLNULLNULLNULL1000100Using filesort

优化后的

explain select film_id,description from sakila.film order by film_id LIMIT 50,5;

执行结果

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEfilmNULLindexNULLPRIMARY2NULL55100NULL

效果很明显,开始是要扫描1000条数据,下面要扫描55条数据,所以当排序效果一致时 应该率先按照主键来排序。

优化的基本思想就是减少IO

二 索引优化

选取那一列做索引

一般是按照自己的业务需要 但是在选取联合索引的时候一般是选取离散程度更高的列放在离散程度更低的列前面(在做比较的时候,一般也是选取离散程度高的做索引列)

离散程度 一般这列中唯一值多离散程度就高

select count(distinct customer_id),count(distinct staff_id) from payment;
count(distinct customer_id)count(distinct staff_id)
5992

customer_id的离散值就比staff_id的离散值高

冗余、重复索引

索引多了 不但会影响插入(更新 插入 删除)语句,同时会影响查询语句

一般分为重复、冗余 。

重复:例:一般主键上就会有唯一索引,但再在主键上添加一个索引就叫重复
冗余:联合索引中已经包含了 改列,但他又有单独的索引,就叫冗余缩影

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值