查询优化,索引优化,库表结构优化需要齐头并进,一个不能落。  

  为什么查询速度会慢

  在阐释编写快速的查询之前,需要清楚一点,真正重要的是响应时间。如果把查询看做是一个任务的话,那么它由一系列子任务构成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少任务的查询次数。通常来说,查询的生命周期大致可以按照顺序来看:冲客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”可以任务是整个生命周期的重要极端,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序和分组等。

  慢查询基础:优化数据访问

  1.确认应用程序是否在检索大量超过需要的数据。中通常意味着访问了太多的行,但是有时候也可能访问了太多的列。

  2.确认MySQL服务器层是否分析大量超过需要的行。

  是否想数据库请求了不需要的数据

  1查询了不需要的记录

  2多表关联时返回了全部的列

一般MySQL能够使用如下三种方式应用WHERE条件,从好到坏依次为:

  1在索引中使用WHERE 条件来过滤不匹配的理论,这是在存储引擎中完成的。

  2使用索引覆盖扫描(在Extra列中出现了Using index) 来返回记录的,直接从索引中过滤不需要的记录并返回命中结果。这是在MySQL服务器完成的,但无需在回表查询记录。

  3从数据表中返回数据,然后过滤不满足的距离(在Extra列中出现了Using where )。这在MySQL服务器层完成,MySQL首先需要从数据表读出记录,然后过滤。

如果发现查询需要扫描大量的数据,但只是返回了少数行,那么通常可以尝试下面的技巧去优化它:

  1使用索引覆盖扫描,把所有需要用的列都放到索引中,这样存储引擎无需回表获取对应行就可以返回结果了

  2改变库表结构。例如:单独使用汇总表。

  3重写这个复杂的查询,让MySQL优化器能够以更优化的方式执行这个查询

  

  3总是取出全部的列(每次看到SELECT * 的时候都需要用怀疑的样审视,是不是真的需要返回全部的列。取出全部的列,优化器无法完成索引覆盖扫描这类优化,还肯能会为服务器带来额外的io,内存和cpu消耗)

  4重复查询相同的数据(最好的方法是,当初次查询的时候将这个数据缓存起来,需要的时候从缓存取出,这样做性能更好。)

Mysql 查询性能优化的更多相关文章

  1. MySQL查询性能优化(精)

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  2. 170727、MySQL查询性能优化

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  3. 到底该不该使用存储过程 MySQL查询性能优化一则

    到底该不该使用存储过程   看到<阿里巴巴java编码规范>有这样一条 关于这条规范,我说说我个人的看法 用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术牛逼,就视 ...

  4. MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另一种查询性能优化方式 ...

  5. MySQL优化技巧之五(mysql查询性能优化)

    对于高性能数据库操作,只靠设计最优的库表结构.建立最好的索引是不够的,还需要合理的设计查询.如果查询写得很糟糕,即使库表结构再合理.索引再合适,也无法实现高性能.查询优化.索引优化.库表结构优化需要齐 ...

  6. MySQL查询性能优化---高性能(二)

    转载地址:https://segmentfault.com/a/1190000011330649 避免向数据库请求不需要的数据 在访问数据库时,应该只请求需要的行和列.请求多余的行和列会消耗MySql ...

  7. 《高性能MySQL》之MySQL查询性能优化

    为什么查询会慢? 响应时间过长.如果把查询看做是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数, ...

  8. mysql查询性能优化

    mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...

  9. MySQl 查询性能优化相关

    0. 1.参考 提升网站访问速度的 SQL 查询优化技巧 缓存一切数据,读取内存而不是硬盘IO 如果你的服务器默认情况下没有使用MySQL查询缓存,那么你应该开启缓存.开启缓存意味着MySQL 会把所 ...

随机推荐

  1. Linux定时运行与开机运行任务

    http://os.51cto.com/art/200805/75144.htm at命令与crontab命令 http://os.51cto.com/art/201007/211874.htm ht ...

  2. 【HDOJ】1438 钥匙计数之一

    状态压缩.分最后一个槽的值以及当前的配置方案是否可以进行DP. /* 1438 */ #include <cstdio> #include <cstring> #include ...

  3. -_-#【Backbone】View

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 2013=12=2 bitree-----补充

  5. linux内核--自旋锁的理解

    http://blog.chinaunix.net/uid-20543672-id-3252604.html 自旋锁:如果内核配置为SMP系统,自旋锁就按SMP系统上的要求来实现真正的自旋等待,但是对 ...

  6. ehcache报错ERROR n.s.e.store.disk.DiskStorageFactory - Disk Write的解决办法

    23:53:44 ERROR n.s.e.store.disk.DiskStorageFactory - Disk Write of com.koal.**.**.**.**.**.***Impl$$ ...

  7. 如何将HashMap,按照value值排序

    这里要用到一个Comparator的接口,里面只有一个方法,compare(),我们实现这个接口就好,很简单 private class ValueComparator implements Comp ...

  8. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题

    在VS2008和opendv的环境下: error LNK2019: 无法解析的外部符号_cvDestroyWindow,该符号在函数_wmain 中被引用 error LNK2019: 无法解析的外 ...

  9. Android 用ping的方法判断当前网络是否可用

    判断网络的情况中,有个比较麻烦的情况就是连上了某个网络,但是那个网络无法上网 ,,, = = 想到了用ping指令来判断,经测试,可行~ ~ ~ private static final boolea ...

  10. Linux Kernel basics

    Linux内核作用: The Linux kernel is the heart of the operating system. It is the layer between the user w ...