博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql中查询速度的优化
阅读量:6067 次
发布时间:2019-06-20

本文共 2445 字,大约阅读时间需要 8 分钟。

hot3.png

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语句的查询时间与起始记录的位置成正比
2limit语句是很方便,但是对记录很多的表并不适合直接使用。

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

你可能感兴趣的文章
理解B树索引
查看>>
vi编辑器的命令集合
查看>>
Mysql利用binlog恢复数据
查看>>
解决 Windows启动时要求验证
查看>>
我的友情链接
查看>>
用yum安装mariadb
查看>>
一点IT"边缘化"的人的思考
查看>>
Gallery循环滑动
查看>>
Sql与C#中日期格式转换总结
查看>>
iOS开发流程总结
查看>>
hadoop datanode 启动出错
查看>>
js颜色拾取器
查看>>
IDEA使用(1)intellIJ idea 配置 svn
查看>>
Thread Safety in Java(java中的线程安全)
查看>>
WPF 降低.net framework到4.0
查看>>
数据管理DMS 全量SQL诊断:你的SQL是健康的蓝色,还是危险的红色?
查看>>
搭建一个通用的脚手架
查看>>
开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
查看>>
开源磁盘加密软件VeraCrypt教程
查看>>
本地vs云:大数据厮杀的最终幸存者会是谁?
查看>>