MySQL优化特定类型的查询(代码示例)
优化关联查询
要是想要优化运用关联的查询,我们需要特殊留神下列几点:
1、确保ON或者USING子句中的列上有索引。在新建索引的时候需要考虑到关联的次序。当表A和表B用列c关联的时候,要是优化器的关联次序是B、A,那么就不需要在B表的对应列上建索引。除非有其他理由,不然只需要在关联次序的第二个表的对应列上新建索引,没实用的索引只会带来额外的承担。
2、确保任何的GROUP BY 和 ORDER BY 中的表达式只波及一个表中的列,这样MySQL才有可能运用索引来优化这个历程。
3、当升级MySQL的时候需要注意:关联语法、运算符优先级等其他可能会产生变化的地方。
优化GROUP BY 和 DISTINCT
在许多场景下,MySQL都运用一样的方法优化这两种查询,事实上MySQL优化器会在内部处置的时候彼此转换这两类查询。它们都可以运用索引来优化,这也是最有效的优化方法。
当没法运用索引的时候,GROUP BY运用两种战略来完成:运用暂时表或者文件排序来做分组。关于任何查询语句,这两种战略的机能都可有可以提拔的地方。我们可以通过提醒 SQL_BIG_RESULT 和 SQL_SMALL_RESULT 来让优化器按照你但愿的方式运转。
优化LIMIT 分页
在系统中需要进行分页操纵的时候,我们平常会运用LIMIT 加上偏移量的办法实现,同时加上合适的ORDER BY 子句。要是有对应的索引,平常效率会不错,不然,MySQL需要做批量的文件排序操纵。
但是有一个非常常见又头疼的题目就是,在偏移量非常大的时候,例如可能是 LIMIT 10000,20这样的查询,此时MySQL需要查询10020 笔记录并只返回最后的20条,这样的代价非常高。
要是所有的页面被拜访的频率都雷同,那么这样的查询均匀需要拜访半个表的数据。要优化这种查询,要末是在页面中限定分页的数目,要末是优化大偏移量的机能。
优化此类分页查询的一个最简略的方法就是尽可能地运用索引遮盖扫描,而不是查询所有的列。然后依据需要做一次关联操纵最后返回所需要的列。关于偏移量很大的时候,这样做的效率会提高许多。考虑下面这个查询:
SELECT file_id, description FROM sakila.film ORDER BY title LIMTI 50, 5;
要是这个表很大,最佳可以将这个查询修改成下面这个模样:
SELECT file.file_id, file.description FROM sakila.film INNER JOIN( SELECT film_id FROM sakila.film ORDER BY title LIMIT 50, 5 )
这里的“推迟关联”将大大提高查询效率,它让MySQL扫描尽可能少的页面,猎取需要拜访的记载后再依据关联列回原表查询所需要的所有列。
还有别的一种优化的办法,就是运用利用程序记载上次数据的位置,鄙人次查询时就可以直接从该记载的位置开端扫描,这样就以免了运用OFFSET。
运用这样的办法可以将其酿成一个范畴查询,不管翻页到多背面,其机能都会非常不错。
以上就是MySQL优化特定类型的查询(代码示例)的细致内容,更多请关注 百分百源码网 其它相干文章!