到目前爲止,以下是我的方案:MySQL的指數不工作(使用案例的具體情況)
參數由用戶控制:(這些參數由儀表板控制,但是出於測試目的,我創建SQL參數,以便改變它們的值)
SET @device_param := "all devices";
SET @date_param_start_bar_chart := '2016-09-01';
SET @date_param_end_bar_chart := '2016-09-19';
SET @country_param := "US";
SET @channel_param := "all channels";
查詢運行在後端
SELECT
country_code,
channel_report_tag,
SUM(count_more_then_30_min_play) AS '>30 minutes',
SUM(count_15_30_min_play) AS '15-30 Minutes',
SUM(count_0_15_min_play) AS '0-15 Minutes'
FROM
channel_play_times_cleaned
WHERE IFNULL(country_code, '') =
CASE
WHEN @country_param = "all countries"
THEN IFNULL(country_code, '')
ELSE @country_param
END
AND IFNULL(channel_report_tag, '') =
CASE
WHEN @channel_param = "all channels"
THEN IFNULL(channel_report_tag, '')
ELSE @channel_param
END
AND iFnull(device_report_tag, '') =
CASE
WHEN @device_param = "all devices"
THEN iFnull(device_report_tag, '')
ELSE @device_param
END
AND playing_date BETWEEN @date_param_start_bar_chart
AND @date_param_end_bar_chart
GROUP BY channel_report_tag
ORDER BY SUM(count_more_then_30_min_play) DESC
limit 10 ;
,我已經應用的指數是
CREATE INDEX my_index
ON channel_play_times_cleaned (
country_code,
channel_report_tag,
device_report_tag,
playing_date,
channel_report_tag
)
我按照這個鏈接:My SQL Index Cook-Book Guide創建我的索引。
但是,執行上述查詢時關鍵字EXPLAIN告訴我沒有使用索引。
我想我在做什麼錯在這裏?
你是對的。問題是我使用的是pentaho社區儀表板編輯器,它只允許我提供sql查詢作爲數據源,因此我不得不將這個邏輯應用於數據庫級別。有沒有其他方法可以實現相同的功能? –
我沒有看到任何方式使用case表達式的條件索引,甚至沒有索引生成的列。你可以聲明一個索引來支持日期範圍過濾器和group by子句,所以MySQL可以使用索引來滿足一些標準。 – Shadow
+1 @Shadow,但我認爲有一種方法可以用優化器可以使用的術語來表達謂詞,並使用適當的索引(儘管我認爲不僅僅需要一個索引,因此可以選擇適當的索引在計劃階段)。 –