通过explain关键字可以模拟优化器执行sql查询,分析查询语句或表结构的性能瓶颈。通过explain我们可以知道: 1、表的读取顺序 2、数据读取操作的类型 3、哪些索引可以使用以及实际被使用的索引 4、表置键的引用 5、每张表有多少行被优化器查询 通过实际案例来解释explain的使用以及具体分析: 使用的方式很简单,只需要在sql语句前面加上explain关键字,然后运行。 1、具体的字段代表的含义这里就不在赘述,请参考博文 https://blog.csdn.net/why15732625998/article/details/80388236 2、通过查询结果显示,三条语句都达到了ref级别,说明语句基本达标。但在Extra中显示表a中显示了Using temporary和Using filesort,这个就不nice了。 distinct的使用产生了Using temporary,但这个去重操作又是不可避免的;order by的使用产生了Using filesort,Using filesort表示在索引之外需要额外进行外部的排序动作,一般可以通过合适的索引来减少或者避免。参考博文 https://www.cnblogs.com/jikuanhao/p/11147391.html 3、语句中我注释了查询条件b.is_del=0,是因为该列中存在null值,而null会使索引失效。 4、如何查询表索引:show keys from tablename 或 show index from tablename ,具体可见博文 https://blog.csdn.net/justry_deng/article/details/81458470 -------------------------我是分割线----------------------------------------- 一般不建议联表查询,很多高性能应用都会对关联查询进行分解,主要有如下优势: 1、将查询分解后,执行单个表查询可以减少锁的竞争。 2、一般高性能应用都会添加缓存机制,分解关联查询让缓存的效率更高(关联表时,若某个表发生变化,则整个缓存无法使用,但分表查询只对变化的表查询缓存有影响)。 3、在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。 4、查询效率可能会有所提升,这要看具体的情况(单表in查询按主键或索引顺寻查询比随机关联查询效率高),其次我们知道mysql的单表查询效率比联表查询效率更高。 5、可以减少冗余查询。 6、有利于后期的分库分表。 补充:explain extended select keys from table; show warnings; -- 显示当前语句可以优化的建议 |
|