我有一個50列的表。我定義一個指數(不是唯一的)具有以下6列:MySQL:爲什麼沒有使用索引的所有鍵?
rdsr_id (int),
StartOfXrayIrradiation (datetime),
PatientsBirthDate (date),
DeviceObserverUID (varchar(100)),
IdentifiedProtocolShort (varchar(50)),
RedundantEntryFromDoseSummary (tinyint(1))
的表稱爲報告,有大約20'000行和增長。運行以下查詢時,結果顯示僅使用索引的4個鍵。
EXPLAIN EXTENDED SELECT r.PatientID, r.StartOfXrayIrradiation, MeanCTDIvol_in_mGy
FROM report r
INNER JOIN ct_irradiation_events e ON r.rdsr_id = e.rdsr_id
INNER JOIN patient_age_categories a ON (DATEDIFF(r.StartOfXrayIrradiation, r.PatientsBirthDate) <= a.max_age_days
AND DATEDIFF(r.StartOfXrayIrradiation, r.PatientsBirthDate) >= a.min_age_days
AND a.description = 'Erwachsene')
WHERE MeanCTDIvol_in_mGy IS NOT NULL
AND r.DeviceObserverUID = '2.25'
AND r.IdentifiedProtocolShort = 'XXXXX'
AND r.RedundantEntryFromDoseSummary =0
AND e.CTAcquisitionType != 'Constant Angle Acquisition'
AND DATEDIFF(r.StartOfXrayIrradiation, '2013-01-06') >=0
AND DATEDIFF(r.StartOfXrayIrradiation, '2014-03-06') <=0;
結果爲表報告:
> id: 1
> select_type: SIMPLE
> table: r
> type: ref
> possible_keys: TimelineHistogramQueries
> key: TimelineHistogramQueries
> key_len: 4
> ref: rdsr.e.rdsr_id
> rows: 1
> filtered: 100.00
> Extra: Using where
,所以我猜列IdentifiedProtocolShort和RedundantEntryFromDoseSummary不習慣?查詢的結果是1400行。從WHERE子句中刪除兩列時,找到9500行。順便說一句:我創建索引後,運行「ANALYZE TABLE報告」,如果這很重要...
爲什麼不是索引的所有鍵使用?我應該改變我的索引嗎?
我沒有正確理解EXPLAIN的輸出。所以key_len 4表示4個字節而不是4個鍵。我以前閱讀過文檔。索引的第二個鍵是StartOfXrayIrradiation,這是查詢中使用的表格報告的第二列。從索引的左側開始,接下來是rdsr_id StartOfXrayIrradiation。那爲什麼不使用呢?其實我試圖爲這個查詢做一個索引。如您所見,在查詢中多次使用StartOfXrayIrradiation。我還需要多次將它添加到索引中嗎?謝謝! – nightlyop
@nightlyop:要清楚,你有一個索引,每列有六列或六個索引嗎? – eggyal
一個6列的索引。 – nightlyop