0

我有一个大约有 1 亿行的表。必须使用 BETWEEN 运算符。我看到查询运行得很慢。

我在 t.name 上的交易者表第一个上添加了 2 个索引,第二个索引是 t.amount 和 t.price。

查询执行非常缓慢。使用 BETWEEN 运算符时,对价格和金额进行索引是否有帮助。另外,我该如何优化呢?

select t.trader_id, t.name, t.city, t.state 
from trader t where exists 
( 
SELECT null 
FROM city_present p,city_state c 
WHERE p.name = 'TEST_TEST'
AND c.city = p.city
AND c.state = p.state
AND t.city = c.city 
AND t.state = c.state 
AND t.price IS NOT NULL 
AND t.price between (25.00000 , 58.000000) 
AND t.amount IS NOT NULL 
AND t.amount BETWEEN (-2500.0000 , 2800.000) 
) 
AND t.name = 'john test' 
AND t.is_valid= 1
4

1 回答 1

4

选择性是优化性能的关键 - 在 city_present.name 为 'TEST_TEST' 的城市/州中,is_valid = 1 的交易者可能比价格在 25 到 58 之间、金额在 25 到 58 之间的交易者少得多-2500 和 2800。

因此,我建议在 trader 表上设置索引,在 name、city、state 和 is_valid 上(按此顺序),然​​后尝试以下查询:

SELECT t.trader_id, t.name, t.city, t.state 
FROM trader t
JOIN (select distinct p.city, p.state
      from city_present p
      JOIN city_state s
        ON s.city  = p.city AND s.state = p.state 
      WHERE p.name = 'TEST_TEST') c
  ON t.city  = c.city AND t.state = c.state 
WHERE t.price between (25.00000 , 58.000000) 
  AND t.amount BETWEEN (-2500.0000 , 2800.000) 
  AND t.name = 'john test' 
  AND t.is_valid= 1
于 2013-06-02T12:18:58.883 回答