鍍金池/ 問(wèn)答/Java  PHP  數(shù)據(jù)庫(kù)/ 請(qǐng)問(wèn)mysql加了group by 后其他索引失效了,怎么解決?

請(qǐng)問(wèn)mysql加了group by 后其他索引失效了,怎么解決?

EXPLAIN SELECT
  s.id,
  s.name,
  s.price,
  s.unit,
  s.qty,
  s.remark,
  s.image,
  s.cuft,
  s.volume,
  s.status,
  s.vender_id AS venderId,
  s.booth_id AS boothId,
  s.booth_no AS boothNo,
  s.show_booth_no AS showBoothNo,
  s.name_en AS nameEn,
  s.bar_code AS barCode,
  s.product_code AS productCode,
  s.type_one_id AS typeOneId,
  s.type_one_name AS typeOneName,
  s.type_two_id AS typeTwoId,
  s.type_two_name AS typeTwoName,
  s.ep_price AS epPrice,
  s.pack_cn AS packCn,
  s.pack_en AS packEn,
  s.inner_box AS innerBox,
  s.out_chest_long AS outChestLong,
  s.out_chest_width AS outChestWidth,
  s.out_chest_height AS outChestHeight,
  s.pack_long AS packLong,
  s.pack_width AS packWidth,
  s.pack_height AS packHeight,
  s.sample_long AS sampleLong,
  s.sample_width AS sampleWidth,
  s.sample_height AS sampleHeight,
  s.can_supply AS canSupply,
  s.rough_weight AS roughWeight,
  s.net_weight AS netWeight,
  s.is_delete AS isDelete,
  s.create_by AS createBy,
  s.create_date AS createDate,
  s.update_by AS updateBy,
  s.update_date AS updateDate,
  s.credentials AS credentials,
  s.credentials_id AS credentialsId,
  s.vender_name AS venderName,
  s.vender_code AS venderCode,
  s.booth_no AS boothNo,
  (SELECT
    sl.name
  FROM
    sys_login sl
  WHERE id = s.update_by) AS updateName,
  (SELECT
    sl.name
  FROM
    sys_login sl
  WHERE id = s.create_by) AS createName,
  v.contact1 AS contact1,
  v.tel1 AS tel1,
  v.phone1 AS phone1,
  v.meet_phone AS meetPhone,
  v.fax AS fax,
  v.qq AS qq,
  v.sms_code AS smsCode,
  (SELECT
    bh.end_date
  FROM
    booth_hire bh
  WHERE bh.booth_no = s.booth_no
    AND bh.vender_id = s.vender_id
    AND bh.status = 0
  LIMIT 1) AS boothEndDate,
  (SELECT
    sl.name
  FROM
    sys_login sl
  WHERE sl.id = s.create_by) AS createName,
  (SELECT
    sl.name
  FROM
    sys_login sl
  WHERE sl.id = s.update_by) AS updateName,
  s.sold_out_by AS soldOutBy,
  s.sold_out_date AS soldOutDate,
  s.sold_out_type AS soldOutType
FROM
  sample s
  LEFT JOIN vender v
    ON s.vender_id = v.id
WHERE 1 = 1
  AND s.status != 3
  AND s.status != - 1
  AND s.is_delete = 0
group by s.vender_id
LIMIT 0,100

clipboard.png

clipboard.png

回答
編輯回答
半心人

測(cè)試表qxd_usernumber是索引列,reg_dev是普通列,沒(méi)有加索引

1.group by 沒(méi)加條件的時(shí)候是全表掃描

clipboard.png

2.請(qǐng)用where條件帶上索引,先后關(guān)系是先wheregroup by

clipboard.png

3.group by 索引列,這樣可以走索引

clipboard.png

clipboard.png

2017年1月25日 23:24
編輯回答
冷溫柔

你應(yīng)該來(lái)一個(gè) http://sqlfiddle.com/#!2/70129/2

2017年10月4日 04:57
編輯回答
心癌

首先,select里面寫(xiě)join看著超級(jí)煩,為什么不能放在from里面join呢,怎么看怎么不順眼,還有createName、updateName要寫(xiě)兩遍?
然后,!=是不會(huì)走索引的,還有is_delete這種性別字段一樣屬性,如果過(guò)濾結(jié)果集基本都是很少的情況下可以用一下索引,否則加了索引本就沒(méi)多少意義。這時(shí)候有個(gè)group by字段選擇性更好的話,當(dāng)然就會(huì)用group的索引了,因?yàn)榉凑愣家乇聿樵兊摹?br>So。索引失效很正常,如果一定要用的話,加force index好了

2018年7月21日 21:21