使用order by优化mysql查询性能

plicqrtu  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(142)

我正在尝试优化下面的mysql查询:

SET lc_time_names = 'fr_FR';
SET @j = '{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[1.31321,48.024146],[1.63456,48.024146],[1.63456,48.150283],[1.31321,48.150283],[1.31321,48.024146]]]}}';
SET @zone = ST_GeomFromGeoJson(@j);
create temporary table A as select id, field1, field2, ... from mybase WHERE val > 0 and ST_CONTAINS(@zone, pt) and year(date_date) IN ('2022','2021','2020') order by date_date DESC limit 200;
select * from A WHERE 1;
...

当前创建临时表需要15秒,但当我删除order by date_date DESC时,时间减少到0.1秒!
当前索引:“pt”字段上的空间和“date_date”字段上的索引
EXPLAIN显示保留“order by”语句时只使用了日期索引而没有使用空间索引。如果删除“order by date_date”,它将使用空间索引。
该表有800万行。
你知道如何优化订单吗?
谢谢你的帮助!

disho6za

disho6za1#

  • 可能 * 优化器会先使用SPATIAL索引。您确实有这样的??

问题是在WHERE中有3个子句,每个子句都可以使用索引,但不能有两个子句使用相同的索引。
如果在date_date上使用索引是有益的,则将

and  year(date_date) IN ('2022','2021','2020')

AND date_date >= '2020-01-01'
      AND date_date  < '2022-01-01'

且具备了

INDEX(date_date)
  • 如果 * 优化器选择使用该索引,则重新制定将使其避免对结果进行排序,并且 * 可能 * 避免阅读超过200行。

我不能更确定,因为这取决于数据的分布和月相。

相关问题