-
查询后面加limit;
-
只查询需要的列;
-
如果查询相同的数据,可以用缓存存储起来;
-
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);
优势:
-
让缓存的效率更高;
-
查询分解后,执行单个查询可以减少锁的竞争;
-
在应用层做关联,更容易对数据库进行拆分,更容易提高高性能和可拓展;
-
可以减少冗余记录的查询;