嗨有没有办法优化这个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
...
答案 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)
使用search
类型的列CHAR(4)
创建其他表格并填写所有搜索值:0010
,DHIL
,...
运行查询:
SELECT ADDRESS , D_ADDRESS , U_DATA
FROM DATABASE1.TABLE1
WHERE ADDRESS IN (SELECT search FROM search_table)
或
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
一个常量列表。