技术开发 频道

MySQL优化总结

  ⊙Using index for group-by

  类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。

  通过相乘EXPLAIN输出的rows列的所有值,你能得到一个关于一个联接如何的提示。这应该粗略地告诉你MySQL必须检查多少行以执行查询。当你使用max_join_size变量限制查询时,也用这个乘积来确定执行哪个多表SELECT语句。

  下列例子显示出一个多表JOIN如何能使用EXPLAIN提供的信息逐步被优化。

  假定你有下面所示的SELECT语句,计划使用EXPLAIN来检查它:

  EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,

  tt.ProjectReference, tt.EstimatedShipDate,

  tt.ActualShipDate, tt.ClientID,

  tt.ServiceCodes, tt.RepetitiveID,

  tt.CurrentProcess, tt.CurrentDPPerson,

  tt.RecordVolume, tt.DPPrinted, et.COUNTRY,

  et_1.COUNTRY, do.CUSTNAME

  FROM tt, et, et AS et_1, do

  WHERE tt.SubmitTime IS NULL

  AND tt.ActualPC = et.EMPLOYID

  AND tt.AssignedPC = et_1.EMPLOYID

  AND tt.ClientID = do.CUSTNMBR;

  对于这个例子,假定:

  · 被比较的列声明如下:  

  · 表有下面的索引:  

  · tt.ActualPC值不是均匀分布的。

  开始,在进行优化前,EXPLAIN语句产生下列信息:

  table type possible_keys key key_len ref rows Extra

  et ALL PRIMARY NULL NULL NULL 74

  do ALL PRIMARY NULL NULL NULL 2135

  et_1 ALL PRIMARY NULL NULL NULL 74

  tt ALL AssignedPC, NULL NULL NULL 3872

  ClientID,

  ActualPC

  range checked for each record (key map: 35)

  因为type对每张表是ALL,这个输出显示MySQL正在对所有表产生一个笛卡尔乘积;即每一个行的组合!这将花相当长的时间,因为必须检查每张表的行数的乘积!对于一个实例,这是74 * 2135 * 74 * 3872 = 45,268,558,720行。如果表更大,你只能想象它将花多长时间……

1
相关文章