探讨 mysql 查询缓慢的几个方向
在编写快速的查询之前,需要要清楚一点,真正重要的是响应的时间,而且你要知道在整个 SQL 语句执行过程中,每个步骤都需要花费多长时间,要知道哪些步骤是拖垮查询效率的关键步骤,想要做到这一点,必须要知道查询的生命周期,然后进行优化,不同的应用场景有着不同的优化方式,不要一个人弄具体情况具体分析。
查询慢的原因到底有哪些?一般情况下,表里数据不是特别多的时候,其实改变 SQL 语句的差别不大,但是当表中的数据量形成一定规模之后,查询慢的情况经常发生。以下是几个主要的查询缓慢的原因
1、网络:网络对 MSQL 有影吗? 影响非常大,在进行数据访问的时候很多情况下数据都是在数据中心进行存放的,当需要跨异地的数据读取的时候,网络就变成了一个至关重要的影响点,特别是在分布式环境中,影响更为突出,因此要尽量减少网络对于数据访问的影响。
2、CPU:在执行不同的操作的时候,是通过 CPU 的轮转来完整各个任务的执行的,所以时间片的分配会在一定程度上影响数据库的查询效率。
3、IO:我们进行 SQL 调优最关键的点其实就是在优化 IO。
4、上下文切换:有 N 多个进程在执行,某个进程的时间片用完后,就切换另一个进程执行,切换时就需要保护现场恢复现场比较浪费时间。
5、系统调用:这个是操作系统内核中的核心概念,涉及到 io 的模型,一般是由具体的 IO 框架来控制的,我们无法进行优化
6、生成统计信息:MySQL 里的 Show Profiles 和 Performance Schema 这些统计信息的生成,都需要占用一定的资源,此时也会影响数据的查询。
7、锁等待时间:在并发应用里,锁是非常麻烦的一个问题。一旦涉及到锁就是一个令人头大的问题。在 MySQL 里有表锁和行锁。当你在面试时遇到锁相关的问题,不要一上来就聊读锁写锁,这样不特别专业,因为锁的机制是和对应的存储引擎相关的,我们经常用的存储引擎是 MyISAM 和 InnoDB,myISAM 里面有两种锁: 共享读锁和独占写锁,InnoDB 也有两种锁: 共享锁和排他锁。锁的名称是不同,内部实现也不一样,MyISAM 在锁的时候只能锁表,而 InnoDB 可以锁表也能锁行,但要注意一件事儿,InnoDB 锁的对象是谁?锁的是索引,如果没有对应的索引可以加锁的话,那么就会由行锁退化成表锁。
基本上 sql 查询慢时间都损耗在这几个层面,我们最常用的能在代码层面优化的也就是 3 中所说的 SQL 调优,优化 IO
版权声明: 本文为 InfoQ 作者【@下一站】的原创文章。
原文链接:【http://xie.infoq.cn/article/16bb0a135232f56bad5a75556】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论