2017-03-16 38 views
0

我有一個選擇連接一個表與它的主鍵與一個函數的結果,它不使用主鍵索引。我該如何強制使用索引?我嘗試了FORCE指令,但它不起作用。MySQL加入函數時使用索引

Image

的選擇

SELECT * FROM tb1 where id = get_last(25) 

結構

CREATE TABLE `tb1` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `prof` INT(11) NOT NULL, 
    `start_date` DATETIME(6) NOT NULL, 
    `end_date` DATETIME(6) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `IX_prof` (`prof`) 
); 

CREATE DEFINER=`root`@`%` FUNCTION `get_last`(prof int) RETURNS int(11) 
BEGIN 
    DECLARE id int(11); 
    select a.id INTO id from tb1 a 
    where a.prof = prof 
    and a.end_date in (
     SELECT MAX(b.end_date) 
     FROM tb1 b 
     WHERE b.prof = a.prof 
    ); 
RETURN id; 
END 
+1

更換您的prof指數是否有使用功能,而不是嵌套查詢的任何特別的原因嗎? – matino

+0

如果你問爲什麼在解釋中沒有「使用索引」 - 那是因爲你選擇了所有列,並且mysql無法從索引中獲取所有值。你使用的地方和它意味着你一般都沒問題(儘管使用那種類型的函數不是太好) – Alexey

+0

我認爲問題是查詢不使用索引,因爲在possible_keys和key中有'NULL'列。 – matino

回答

2

你工作得太辛苦。折騰的功能和簡單的說

SELECT * 
    FROM tb1 
    WHERE prof = 25 
    ORDER BY end_date DESC 
    LIMIT 1; 

進一步的性能,與

INDEX(prof, end_date)