我有一个SELECT将带有主键的表与函数的结果连接在一起,并且它不使用主键索引。如何强制使用索引?我尝试使用FORCE指令,但是它不起作用。



选择

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

最佳答案

你工作太辛苦了。抛开功能并简单地说

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


为了获得更好的性能,请将prof上的索引替换为

INDEX(prof, end_date)

10-08 04:43