2017-03-16 8 views
0

私は、SELECTを使ってその主キーと関数の結果を結合し、主キーインデックスを使用しません。インデックスを強制的に使用するにはどうすればよいですか?私は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であなたのインデックスを交換、さらに性能を得るために

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

を言うの? – matino

+0

なぜあなたはすべての列を選択し、mysqlはインデックスからすべての値を取得することができないため、説明に「インデックスを使用する」がないことを尋ねると、あなたはどこにいて、それはあなたが一般的に大丈夫だということを意味しています(しかし、この種のfucntionsはあまり良くありません)。 – Alexey

+0

私は、クエリはインデックスを使用しないと思うのですが、possible_keysとkeyに '列。 – matino

答えて

2

選択。機能をトスし、単にネストされたクエリの代わりに関数を使用するため、特定の理由がある

INDEX(prof, end_date) 
関連する問題