现在sql优化有两种方向,一种是通过增加缓存的方式,比如通过使用redis , mybites 一二级缓存来提高查询效率。 第二种是通过使用explain来分析慢查询的sql语句, 找到该语句的问题从而进行优化。
这里对使用explain来进行优化的方式做一些介绍。
使用方式: explain + sql => 执行 => 查看结果
使用explain会打印出来数据库引擎在底层执行sql语句是具体是怎么做的。
举个例子:
使用explain对这条sql语句进行具体的分析。
explain (ANALYZE on ,TIMING on, VERBOSE on, BUFFERS on, COSTS on )select data_date from e_mp_energy_month where data_date between to_date('2021-02','yyyy-mm-dd') and to_date('2021-02','yyyy-mm-dd') and meter_id in ( 20122700000146 , 20122700000147 , 20122700000148 , 20122700000149 , 20122700000150 , 20122700000151 , 20122700000152 , 20122700000153 , 20122700000154 , 20122700000155 , 20122700000156 , 20122700000157 , 20122700000158 , 20122700000159 , 20122700000160 , 20122700000161 , 20122700000162 , 20122700000163 , 20122700000164 ) order by meter_id,data_date asc
在显示的结果中, cost表示对启动成本和总成本的预估。 cost后面第一个数字代表启动成本(查询到第一行所需要的成本), 第二个数字表示查询结束所需要的成本。
Seq Scan表示这条sql的执行方式时 顺序扫描表。
actual time 表示实际的执行时间(单位毫秒)
buffers -> shared hit 表示在内存中读到了多少块。
filter表示过滤条件。
需要注意的一点是 , 使用了ANALYZE字段的explain, 是真正会执行的 ,修改不可逆。 不使用ANALYZE的explain,只是预执行,不会改变数据库中实际数据。
使用ANALYZE可以获得数据库实际执行时间, 但是修改不可逆, 要想结果可逆, 需要手动rollback。
个人认为,优化后sql, cost的值越小越好 , buffers shared hit的值越高越好。