2011-03-24 67 views
1
mysql> EXPLAIN SELECT fldjobitemid, fldstatus, tblbulkreportjobitems.fldparticipantid, CONCAT(fldFirstName, ' ', fldLastName) as full_name FROM tblbulkreportjobitems FORCE INDEX (fldparticipantid) JOIN tblparticipant ON tblparticipant.fldParticipantId = tblbulkreportjobitems.fldparticipantid WHERE fldjobid = 9 ORDER BY fldjobitemid 
    -> ; 
+----+-------------+-----------------------+--------+--------------------------+---------+---------+------------------------------------------------------+------+-----------------------------+ 
| id | select_type | table     | type | possible_keys   | key  | key_len | ref             | rows | Extra      | 
+----+-------------+-----------------------+--------+--------------------------+---------+---------+------------------------------------------------------+------+-----------------------------+ 
| 1 | SIMPLE  | tblbulkreportjobitems | ALL | fldparticipantid   | NULL | NULL | NULL             | 869 | Using where; Using filesort | 
| 1 | SIMPLE  | tblparticipant  | eq_ref | PRIMARY,fldParticipantId | PRIMARY | 4  | medicus_devel.tblbulkreportjobitems.fldparticipantid | 1 | Using where     | 
+----+-------------+-----------------------+--------+--------------------------+---------+---------+------------------------------------------------------+------+-----------------------------+ 
2 rows in set (0.05 sec) 

为什么它仍然使用文件?试图强制索引MYsql

回答

2

如果密钥数量是表中行数的5%,那么MySQL查询优化器将始终否决您对索引的选择。

运行这些查询,请:

SELECT COUNT(1)FROM tblbulkreportjobitems;
我想这应该是869(从解释计划)

SELECT COUNT(1)FROM tblbulkreportjobitems WHERE fldjobid = 9; SELECT COUNT(1),fldjobid FROM tblbulkreportjobitems GROUP BY fldjobid WITH ROLLUP;其中, SELECT COUNT(1),fldjobid FROM tblbulkreportjobitems GROUP BY fldjobid WITH ROLLUP;其中,

您会看到哪些行出现超过总行数的5%。在这种情况下,MySQL查询优化器将使用不平衡索引选择全表扫描。

如果您在WHERE子句中有fldparticipantid,那么您将得到不同的结果。