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