2013-04-25 128 views
1

下面的查询不使用索引,然后键入解释计划是“ALL”Mysql的FIND_IN_SET在where子句

EXPLAIN EXTENDED

SELECT 
    GROUP_CONCAT(CONCAT(fname,' ',lname)) 
FROM employee WHERE FIND_IN_SET(emp_id,'111582,111624')>0; 

有没有什么办法可以改变使用查询指数。

解释计划:

id : 1 
select_type :SIMPLE 
table : employee 
type : ALL 
possible_keys : {null} 
key : {null} 
key_len : {null} 
ref : {null} 
rows : 546 
filtered : 100 
Extra: Using where 

好心建议我提高使用索引的查询。

由于提前,

+0

什么是指数? – Jocelyn 2013-04-25 07:45:08

+0

而你的索引是在哪个字段? – 2013-04-25 07:45:25

+0

emp_id是索引为 – shiva 2013-04-25 08:44:01

回答

1

FIND_IN_SET是一个字符串函数(在大多数情况下),将导致全表扫描...

用途:

WHERE emp_id IN (111582,111624) 
+1

的主键列,它是很好的答案。但我将111582,111624存储在单独的列中。 WHERE FIND_IN_SET(emp_id,comma_separated_column_name)> 0的情况如何? comma_separated_column_name - 这里的值存储为1212,13224,121213 – shiva 2013-04-25 08:45:29

+0

1)在你使用的编程语言中进行字符串拆分吗?ooor ... 2)修复你的数据库模式,规范化数据。 – 2013-04-25 08:47:14