Sql 消除由于介于(和分组依据)之间而导致的全表扫描

Sql 消除由于介于(和分组依据)之间而导致的全表扫描,sql,mysql,query-optimization,Sql,Mysql,Query Optimization,说明 根据explain命令,有一个范围导致查询执行完整表扫描(160k行)。如何保持距离条件并减少扫描?我估计罪魁祸首是: Y.YEAR BETWEEN 1900 AND 2009 AND 代码 这是具有范围条件的代码(车站/地区可能是多余的) 相关的 谢谢大家! 一个请求。。。看起来你知道你的数据。添加关键字“直线连接”并查看结果 选择直线连接。。。剩下的问题 直接连接告诉MySql按照我列出的那样做。因此,您的城市表是FROM列表中的第一个,这表明您希望它成为您的主要。。。此外

说明

根据
explain
命令,有一个范围导致查询执行完整表扫描(160k行)。如何保持距离条件并减少扫描?我估计罪魁祸首是:

Y.YEAR BETWEEN 1900 AND 2009 AND
代码

这是具有范围条件的代码(车站/地区可能是多余的)

相关的


谢谢大家!

一个请求。。。看起来你知道你的数据。添加关键字“直线连接”并查看结果

选择直线连接。。。剩下的问题

直接连接告诉MySql按照我列出的那样做。因此,您的城市表是FROM列表中的第一个,这表明您希望它成为您的主要。。。此外,城市的WHERE子句是直接过滤器。话虽如此,它可能会遍历查询的其余部分


希望对你有帮助。。。它为我提供了数百万条被查询的记录的政府数据,并加入到mySql试图为我思考的10+个查找表中。

为了在查询之间高效地执行,你需要在你的年份栏中添加一个b树索引。例如:

CREATE INDEX id_index USING BTREE ON YEAR_REF (YEAR);
BTREE索引允许有效的范围查询,如果这实际上是根问题,那么使用这样的索引应该可以摆脱完整表扫描,并且只扫描范围内的表部分。在上阅读更多关于btrees的信息


但是,与任何优化建议一样,您应该进行测量,以确保不会弊大于利。

您可以将搜索范围从半径范围更改为在边界框中搜索吗

您知道城市,因此可以在应用程序中计算边界框

也许这个

S.LATITUDE_DECIMAL >= latitude_lower and  
S.LATITUDE_DECIMAL <= latitude_upper and
S.LONGITUDE_DECIMAL >= longitude_lower and 
S.LONGITUDE_DECIMAL <= longitude_upper
S.LATITUDE\u DECIMAL>=纬度\u下限和
S.纬度\十进制=经度\更低
十进制
+----+-------------+-------+--------+-----------------------------------+---------------+---------+-------------------------------+------+---------------------------------+
| id | select_type | table | type   | possible_keys                     | key           | key_len | ref                           | rows | Extra                           |
+----+-------------+-------+--------+-----------------------------------+---------------+---------+-------------------------------+------+---------------------------------+
|  1 | SIMPLE      | C     | const  | PRIMARY                           | PRIMARY       | 4       | const                         |    1 | Using temporary; Using filesort |
|  1 | SIMPLE      | S     | ALL    | PRIMARY                           | NULL          | NULL    | NULL                          | 7795 | Using where                     |
|  1 | SIMPLE      | SD    | eq_ref | PRIMARY                           | PRIMARY       | 4       | climate.S.STATION_DISTRICT_ID |    1 | Using index                     |
|  1 | SIMPLE      | Y     | ref    | PRIMARY,STAT_YEAR_IDX             | STAT_YEAR_IDX | 4       | climate.S.STATION_DISTRICT_ID | 1650 | Using where                     |
|  1 | SIMPLE      | M     | ref    | PRIMARY,YEAR_REF_IDX,CATEGORY_IDX | YEAR_REF_IDX  | 8       | climate.Y.ID                  |   54 | Using where                     |
|  1 | SIMPLE      | D     | ref    | INDEX                             | INDEX         | 8       | climate.M.ID                  |   11 | Using where                     |
+----+-------------+-------+--------+-----------------------------------+---------------+---------+-------------------------------+------+---------------------------------+
CREATE INDEX id_index USING BTREE ON YEAR_REF (YEAR);
S.LATITUDE_DECIMAL >= latitude_lower and  
S.LATITUDE_DECIMAL <= latitude_upper and
S.LONGITUDE_DECIMAL >= longitude_lower and 
S.LONGITUDE_DECIMAL <= longitude_upper