0

我有 1 亿行的表。我必须使用 BETWEEN 运算符并且查询非常慢。必须获取数量和价格范围内的所有行,或者所有与该城市和州有关的行。

我有 2 个索引,一个在 t.name 上,另一个在 t.city 和 t.state 上。

此查询的性能很慢。如何改进此查询。

SELECT t.trader_id, t.name, t.city, t.state 
  FROM trader t 
  WHERE t.name = 'john test' AND
        is_valid = 1 AND
        ((t.amount BETWEEN (-2500.0000 , 2800.000) AND
          t.price between (25.00000 , 58.000000)) OR 
        (t.city='city' AND
         t.state='state'))

上存在非唯一索引

  1. t.name
  2. t.city, t.州

对于 (name 和 is_valid),大约有 78000 行。对于(价格和金额),大约有 331809 行。对于(城市和州),大约有 13500 行。

4

1 回答 1

1

您没有提供太多硬信息,例如解释计划、索引的存在或数据分布。这减少了猜测的任何答案。

但是,您的问题可能标题错误。BETWEEN 运算符不太可能是性能不佳的主要原因。您有一个 OR 子句,它指定了两组完全不同的标准。所以数据库不能使用任何关于 AMOUNT、PRICE、CITY 或 STATE 的索引。这将负担推给了其余的标准。除非您在 (NAME, IS_VALID) 上有一个复合索引,并且该组合返回您正在查看全表扫描的行的一小部分。1 亿行的全表扫描需要一些时间来执行。

你能做些什么真的取决于我在开场白中指定的细节。在猜测的诊断之上猜测解决方案只是浪费每个人的时间。提供一些细节,然后我们可以进一步讨论。

于 2013-06-18T03:49:54.260 回答