• Mysql 使用一个复杂查询还是多个简单查询


    结论

    MySQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效”

    MySQL内部每秒能够扫描内存中上百万行数据,相比之下,MySQL响应数据给客户端就慢得多了。在其他条件都相同的时候,使用尽可能少的查询当然是更好的。但是有时候,将一个大查询分解为多个小查询是很有必要的

    切分查询

    删除旧的数据就是一个很好的例子。定期地清除大量数据时,如果用一个大的语句一次性完成的话,则可能需要一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。将一个大的DELETE语句切分成多个较小的查询可以尽可能小地影响MySQL性能,同时还可以减少MySQL复制的延迟。例如,我们需要每个月运行一次下面的查询

    mysql> DELETE FROM messages WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH);
    

    改为

    rows_affected = 0
      do {
       rows_affected = do_query(
          "DELETE FROM messages WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH)
          LIMIT 10000")
      } while rows_affected > 0 
    

    一次删除一万行数据一般来说是一个比较高效而且对服务器(5)影响也最小的做法(如果是事务型引擎

    分解关联查询

    mysql> SELECT * FROM tag
      JOIN tag_post ON tag_post.tag_id = tag.id
      JOIN post ON tag_post.post_id = post.id
      WHERE tag.tag = 'mysql';
    

    可以替代为

    mysql> SELECT * FROM  tag_post WHERE tag_id=1';
    mysql> SELECT * FROM  tag_post WHERE tag_id=1234;
    mysql> SELECT * FROM  post WHERE  post.id in (123,456,567,9098,8904);
    
    • 让缓存的效率更高。许多应用程序可以方便地缓存单表查询对应的结果对象。例如,上面查询中的tag已经被缓存了,那么应用就可以跳过第一个查询
    • 将查询分解后,执行单个查询可以减少锁的竞争
    • 在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。
    • 查询本身效率也可能会有所提升。这个例子中,使用IN()代替关联查询,可以让MySQL按照ID顺序进行查询,这可能比随机的关联要更高效
    • 可以减少冗余记录的查询
    • 更进一步,这样做相当于在应用中实现了哈希关联,而不是使用 MySQL 的嵌套循环关联。某些场景哈希关联的效率要高很多。

    参考

    摘自 Mysql 高程。

  • 相关阅读:
    struts2 标签
    Ubutu命令 笔记积累
    虚拟机VirtualBox和Ubutu
    更新PostgreSQL数据
    向PostgreSQL插入数据
    PostgreSQL表依赖性跟踪
    PostgreSQL外部数据
    PostgreSQL分区介绍
    PostgreSQL继承详解
    PostgreSQL模式介绍
  • 原文地址:https://www.cnblogs.com/everlose/p/12809086.html
Copyright © 2020-2023  润新知