我有Mysql查询,如下所示:
SELECT
Main.Code,
Nt,
Ss,
Nac,
Price,
Ei,
Quant,
Dateadded,
Sh,
Crit,
CAST(Ss * Quant AS DECIMAL (10 , 2 )) AS Qss,
CAST(Price * Quant AS DECIMAL (10 , 2 )) AS Qprice,
`Extra0`.`Value`
FROM
Main
LEFT OUTER JOIN
`Extra_fields` AS `Extra0` ON `Extra0`.`Code` = `Main`.`Code`
AND `Extra0`.`Nf` = 2
ORDER BY `Code`
查询非常慢(大约10秒)。没有这部分的查询:
LEFT OUTER JOIN Extra_fields
AS Extra0
ON Extra0
。Code
= Main
。Code
和Extra0
。Nf
= 2
很快。
有没有办法优化第一次查询?
答案 0 :(得分:1)
您希望在联接表上添加索引以帮助按代码和Nf查找值,然后添加“值”列,以便它可以满足选择列表所需的列:
ALTER TABLE Extra_fields ADD KEY (Code, Nf, Value);
您可以通过在Main.Code上添加索引来获益,这样它就可以按排序顺序读取表,而无需执行文件排序:
ALTER TABLE Main ADD KEY (Code);
我在你的查询上运行了EXPLAIN并得到了这个:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: Main
partitions: NULL
type: index
possible_keys: NULL
key: Code
key_len: 5
ref: NULL
rows: 1
filtered: 100.00
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: Extra0
partitions: NULL
type: ref
possible_keys: code
key: code
key_len: 10
ref: test.Main.Code,const
rows: 1
filtered: 100.00
Extra: Using index
第一个表没有filesort。我不得不使用...FROM Main FORCE INDEX(Code)...
,但可能是因为我测试时表中没有行。
第二个表显示它正在使用仅索引访问方法(“Extra:Using index”)。我假设只引用了Extra_fields
中的三列,而其他所有列都来自Main
。