Mysql中查询速度的优化

mysql中查询速度的优化

 

1.查看每一个表的数据量

2.left join的时候尽量减少表的大小,通过临时表,查询条件去限制

3.将固定的条件尽量和传参的条件分开

4.使用参数绑定去生成sql,不要直接用值去直接生成sql,这样可以直接从缓存中获取sql;

5.用in代替or,这是一条简单简易的规则

Select

From table

Where loc_id=10

Or loc_id=20

or loc_od=30

=>select

from location

where loc_id

in (10,20,30)

 

6.解析优化执行

7.尽量为where中被引用的列建立索引

如果用<.,<=,=,>,>=和between ,此时索引将被用到,如果在where中对某些列使用函数,则将不会使用该列的索引.

8.使用explain对认为查询慢的语句sql进行查看

9没有条件和索引时,不要乱用临时表,在创建临时表市也会有性能上的消耗

 

Sql优化的实质:

结果正确的前提下,使用优化器可以识别的语句,充分利用索引,减少表扫描的次数,尽量避免搜索的发生;

 

转载自:http://m.blog.csdn.net/article/details?id=72900541

MySQL大数据使用limlit , 查询效率变低

1.   直接用limit start, count分页语句:

select * from product limit start, count
当起始页较小时,查询没有性能问题,我们分别看下从10 100 1000 10000开始分页的执行时间(每页取20条), 如下:

select * from product limit 10, 20   0.016
select * from product limit 100, 20   0.016
select * from product limit 1000, 20   0.047
select * from product limit 10000, 20   0.094

我们已经看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟起始页码是有很大关系的,那么我们把起始记录改为40w看下(也就是记录的一般左右)                                    select * from product limit 400000, 20   3.229

再看我们取最后一页记录的时间
select * from product limit 866613, 20   37.44

难怪搜索引擎抓取我们页面的时候经常会报超时,像这种分页最大的页码页显然这种时
间是无法忍受的。

从中我们也能总结出两件事情:
1limit语句的查询时间与起始记录的位置成正比
2MySQLlimit语句是很方便,但是对记录很多的表并不适合直接使用。

2.   limit分页问题的性能优化方法

利用表的覆盖索引来加速分页查询
我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。

因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。另外Mysql中也有相关的索引缓存,在并发高的时候利用缓存就效果更好了。

在我们的例子中,我们知道id字段是主键,自然就包含了默认的主键索引。现在让我们看看利用覆盖索引的查询效果如何:

这次我们之间查询最后一页的数据(利用覆盖索引,只包含id列),如下:
select id from product limit 866613, 20 0.2
相对于查询了所有列的37.44秒,提升了大概100多倍的速度

那么如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况:

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20
查询时间为0.2秒,简直是一个质的飞跃啊,哈哈

另一种写法
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id
查询时间也很短,赞!

其实两者用的都是一个原理嘛,所以效果也差不多

 

 

 

 

重写语句min()

Select min(actor_id) from salila.actor where first_name=”xxx”

全表扫描show status

重写如下

Select actor_id from actor use index(primary) where first_name=”penloper” limit 1

优化count()语句

Show status查看需要扫描的行数据

Eg:select count(*) from world.City where id>5

Select (select count(*) from world.City)-count(*) from world.City where id<=5;

 

 

在同一个查询中统计同一列的不同值的数量,减少查询语句

Select sum(if(color-‘blue’,1,0)) as blue ,sum(if(colort=’red’,1,0)) as red from items

295

 

 
总结
1查询中指定dueDate的上限和下限,返回更少的数据
2group by ,order by 中不要使用函数,尽量使用能够有代表性的字段分组(比如说id,就能代替name等)
3条件索引字段上不要使用函数,那样就走不了索引
4exists 代替 in
5添加有效较小rows的索引

 

 

 

转载于:https://my.oschina.net/iioschina/blog/915290

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值