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秒难怪抓取我们页面的时候经常会报超时,像这种分页最大的页码页显然这种时
间是无法忍受的。从中我们也能总结出两件事情:
1)limit语句的查询时间与起始记录的位置成正比2)的limit语句是很方便,但是对记录很多的表并不适合直接使用。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的索引