优化MySql查询?

时间:2015-12-19 13:58:59

标签: mysql sql

嗨有没有办法优化这个mysql查询?

SELECT ADDRESS , D_ADDRESS , U_DATA 
FROM DATABASE1.TABLE1 
WHERE (ADDRESS LIKE '0010') OR 
(ADDRESS LIKE 'DHIL') OR 
(ADDRESS LIKE 'FINN') OR 
(ADDRESS LIKE 'GRWL') OR 
(ADDRESS LIKE 'JNOD') OR 
...

4 个答案:

答案 0 :(得分:2)

由于您没有在选择标准中使用任何通配符,因此所有类似比较都意味着相同。因此,您可以使用in()运算符而不是OR:

SELECT ADDRESS , D_ADDRESS , U_DATA 
FROM DATABASE1.TABLE1 
WHERE ADDRESS IN ('0010', 'DHIL', ...)

答案 1 :(得分:1)

尝试REGEXP例如

WHERE ADDRESS REGEXP '(0010)|(DHIL)|(..)'

只涉及一个更快的测试

此外,如果您只想准确匹配,可以使用FIELD MySQL函数,如:

WHERE FIELD(ADDRESS,'0010|DHIL|..') > 0

甚至

WHERE FIELD(ADDRESS,'0010','DHIL','..') > 0

答案 2 :(得分:0)

  1. 使用search类型的列CHAR(4)创建其他表格并填写所有搜索值:0010DHIL,...

  2. 运行查询:

    SELECT ADDRESS , D_ADDRESS , U_DATA FROM DATABASE1.TABLE1 WHERE ADDRESS IN (SELECT search FROM search_table)

  3. SELECT t.ADDRESS, t.D_ADDRESS, t.U_DATA
      FROM DATABASE1.TABLE1 t JOIN search_table s ON t.ADDRESS=s.search
    

答案 3 :(得分:0)

您应该使用in并创建适当的索引。 in版本(如其他答案中所示)如下所示:

SELECT ADDRESS , D_ADDRESS , U_DATA 
FROM DATABASE1.TABLE1 
WHERE ADDRESS IN ('0010', . . .)

您想要的索引是:

create index idx_table1_address on table1(address);

如果优化器确定它有用,那么该索引将提供更大的提升性能​​。但是,MySQL通过对列表进行排序并进行二进制搜索来优化in一个常量列表。