table type possible_keys key key_len ref rows Extra tt ALL AssignedPC, NULL NULL NULL 3872 Using ClientID, where ActualPC do ALL PRIMARY NULL NULL NULL 2135 Range checked for each record (index map: 0x1) et_1 ALL PRIMARY NULL NULL NULL 74 Range checked for each record (index map: 0x1) et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1 Extended EXPLAIN Output Format This is not perfect, but is much better: The product of the  rows  values is less by a factor of 74. This version executes in a couple of seconds. A second alteration can be made to eliminate the column length mismatches for the  tt.AssignedPC = et_1.EMPLOYID  and  tt.ClientID = do.CUSTNMBR  comparisons: After that modification,  EXPLAIN  produces the output shown here: At this point, the query is optimized almost as well as possible. The remaining problem is that, by default, MySQL assumes that values in the  tt.ActualPC  column are evenly distributed, and that is not the case for the  tt  table. Fortunately, it is easy to tell MySQL to analyze the key distribution: With the additional index information, the join is perfect and  EXPLAIN  produces this result:  The  rows  column in the output from  EXPLAIN  is an educated guess from the MySQL join optimizer. Check whether the numbers are even close to the truth by comparing the  rows  product with the actual number of rows that the query returns. If the numbers are quite different, you might get better performance by using  STRAIGHT_JOIN  in your  SELECT  statement and trying to list the tables in a different order in the  FROM  clause. (However,  STRAIGHT_JOIN  may prevent indexes from being used because it disables semijoin transformations. See Section 8.2.2.1, “Optimizing IN and EXISTS Subquery Predicates with Semijoin Transformations” .) It is possible in some cases to execute statements that modify data when  EXPLAIN SELECT  is used with a subquery; for more information, see Section 13.2.11.8, “Derived Tables” . The  EXPLAIN  statement produces extra (“extended” ) information that is not part of  EXPLAIN  output but can be viewed by issuing a  SHOW WARNINGS  statement following  EXPLAIN . As of MySQL 8.0.12, extended information is available for  SELECT ,  DELETE ,  INSERT ,  REPLACE , and  UPDATE  statements. Prior to 8.0.12, extended information is available only for  SELECT  statements. 1776 8.8.3 Extended EXPLAIN Output Format table type possible_keys key key_len ref rows Extra tt ALL AssignedPC NULL NULL NULL 3872 Using ClientID, where ActualPC et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1 et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1 do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1 table type possible_keys key key_len ref rows Extra et ALL PRIMARY NULL NULL NULL 74 tt ref AssignedPC, ActualPC 15 et.EMPLOYID 52 Using ClientID, where ActualPC et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1 do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1 mysql>  ALTER TABLE tt MODIFY AssignedPC VARCHAR(15), MODIFY ClientID VARCHAR(15); mysql>  ANALYZE TABLE tt;