zoukankan      html  css  js  c++  java
  • 查询性能优化

    1. 查询后面加limit;

    2. 只查询需要的列;

    3. 如果查询相同的数据,可以用缓存存储起来;

    4. mysql最简单衡量查询开销的三个指标:响应时间,扫描行数,返回行数;

      响应时间包括服务时间和排队时间,服务时间就是数据库处理这个查询所花的时间,排队时间一般常见的是I/O和锁等待所花大的事件;

      理想的情况下,扫描行数等于返回行数,但很少发生,如关联查询,扫描多行才能生成结果集的一行;

      在explain语句中type列反应了访问类型,访问类型有很多种,从全表扫描到索引扫描,范围扫描,唯一索引查询,常数引用等,列出来的这些,速度是由快到慢,扫描行数由多到少;索引的列,主键好过普通索引,整型好过字符串类型;

    一个复杂的查询还是多个简单的查询

    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

    这样就可以分解服务器压力;

    分解关联查询

    对每个单表进行一次单表查询,然后将结果在应用程序中进行关联;

    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'

    分解成:

    select * from tag where tag='mysql';

    select * from tag_post where tag_id=1234;

    select * from post where post.id in (123,435,4563);

    优势:

    1. 让缓存的效率更高;

    2. 查询分解后,执行单个查询可以减少锁的竞争;

    3. 在应用层做关联,更容易对数据库进行拆分,更容易提高高性能和可拓展;

    4. 可以减少冗余记录的查询;

  • 相关阅读:
    字符输入输出
    每日一例
    每日一例
    结构
    指针数组的初始化
    装箱,拆箱,正则表达式
    数据类型的转换
    怎样让程序不断执行
    SQL练习1关于插入删除,修改,单表查询
    SQLSERVER 总结1
  • 原文地址:https://www.cnblogs.com/lixiuyuan999/p/6379624.html
Copyright © 2011-2022 走看看