查询性能优化

  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. 可以减少冗余记录的查询;

原文地址:https://www.cnblogs.com/lixiuyuan999/p/6379624.html