“不要过早地优化”这一原则也适用于SQL语句。在开发过程中,先从宏观的角度实现功能;在部署到实际环境中后,可以通过监控MySql的slow query log来监视那些“缓慢”的查询,再酌情优化。
MySql可以对SQL查询语句的结果进行缓存,这个缓存用“未经解析”的SQL语句本身作为索引。这意味着,那怕只是一个空格的差别,也会被认为是不同的SQL语句。当然,如果查询语句中用到了一些“动态”的函数,比如NOW()
,RAND()
等,则查询语句显然是不能认为是一样的。
EXPLAIN
命令可以用来分析SQL语句以检视查询会怎样工作,比如会用到哪些索引等。
参见MySql官方的文档:Optimizing Queries with EXPLAIN
利用索引可以加快查询的速度。在利用索引带来的好处的同时,主要是考虑如何尽量减少索引数据的大小。因为索引越大,越是不容易被读入系统的内存。
Q: 同一条SQL,为什么第一次查询很慢,之后的查询却很快?
A: 一种可能情况是之后的查询用到了Query Cache. 还有另一种情况,是第一次查询引起了Disk IO,而之后的查询却是从磁盘操作系统的磁盘缓存(Cache)中读取数据。