5. 重构查询的方式
5.1. 在优化有问题的查询时,目标应该是找到获得实际需要的结果的替代方法
5.1.1. 但这并不一定意味着从MySQL返回完全相同的结果集
5.1.2. 可以将查询转换为返回相同结果的等价形式,以获得更好的性能
5.2. 以前人们总是认为网络通信、查询解析和优化是一件代价很高的事情
5.2.1. 对于MySQL并不适用
5.2.2. MySQL从设计上让连接和断开连接都很轻量,在返回一个小的查询结果方面很高效
5.2.3. 现代的网络速度比以前要快很多,能在很大程度上降低延迟
5.3. 在MySQL内部,每秒能够扫描内存中上百万行的数据
5.3.1. MySQL响应数据给客户端就慢得多了
5.4. 在其他条件都相同的时候,使用尽可能少的查询当然是更好的
5.4.1. 将一个大查询分解为多个小查询是很有必要的
5.4.2. 如果在一个查询能够胜任时还将其写成多个独立的查询是不明智的
5.5. 切分查询
5.5.1. 删除旧的数据就是一个很好的例子
5.5.1.1. 定期清除大量数据时,如果用一个大的语句一次性完成的话,则可能需要一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询
5.5.1.2. 将一个大的DELETE语句切分成多个较小的查询可以尽可能小地影响MySQL的性能,同时还可以降低MySQL复制的延迟
5.5.2. 一次删除一万行数据一般来说是一个比较高效而且对服务器影响最小的做法(如果是事务型引擎,很多时候小事务能够更高效)
5.5.3. 如果每次删除数据后,都暂停一会儿再做下一次删除,也可以将服务器上原本一次性的压力分散到一个很长的时间段中,可以大大降低对服务器的影响,还可以大大减少删除时锁的持有时间
5.6. 分解联接查询
5.6.1. 很多高性能的应用都会对联接查询进行分解
5.6.2. 可以对每一个表进行一次单表查询,然后将结果在应用程序中进行联接
5.6.3. 让缓存的效率更高
5.6.4. 将查询分解后,执行单个查询可以减少锁的竞争
5.6.5. 在应用层做联接,可以更容易对数据库进行拆分,更容易做到高性能和可扩展
5.6.6. 查询本身的效率也可能会有所提升
5.6.6.1. 使用IN()代替联接查询,可以让MySQL按照ID顺序进行查询,这可能比随机的联接要更高效
5.6.7. 可以减少对冗余记录的访问
5.6.7.1. 在应用层做联接查询,意味着对于某条记录应用只需要查询一次,而在数据库中做联接查询,则可能需要重复地访问一部分数据
http://www.htsjk.com/Mysql/47101.html
www.htsjk.Com
true
http://www.htsjk.com/Mysql/47101.html
NewsArticle
读高性能MySQL(第4版)笔记10_查询性能优化(上), 1.三管齐下 1.1.不做、少做、快速地做 1.2.如果查询太大,服务端会拒绝接收更多的数据并抛出相应错误 1.3.如果查询写得很糟糕,即...
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。