Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在加入函数时使用索引_Mysql_Indexing - Fatal编程技术网

MySQL在加入函数时使用索引

MySQL在加入函数时使用索引,mysql,indexing,Mysql,Indexing,我有一个SELECT,它将一个表与其主键和一个函数的结果连接起来,它不使用主键索引。如何强制使用索引?我试过强制指令,但没用 选择按钮 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,

我有一个SELECT,它将一个表与其主键和一个函数的结果连接起来,它不使用主键索引。如何强制使用索引?我试过强制指令,但没用

选择按钮

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)

你工作太辛苦了。抛出函数并简单地说

SELECT  *
    FROM  tb1
    WHERE  prof = 25
    ORDER BY  end_date DESC
    LIMIT  1;
为了进一步提高性能,请将
prof
上的索引替换为

INDEX(prof, end_date)

使用函数代替嵌套查询有什么特别的原因吗?如果你问为什么解释中没有“使用索引”,那是因为你选择了所有列,mysql无法从索引中获取所有值。你可以使用where,这意味着你基本上是可以的(尽管使用这种函数不是很好),我认为问题是查询没有使用索引,因为在可能的键和键列中有
NULL
。@matino事实上没有NULL。我更改了表定义以反映这一点,结果是相同的。将函数声明为
确定性
(将单词
确定性
放在
开始
之前)。或者,最好不要为此使用函数并在子查询中计算值(您基本上可以将
从tb1 a中选择a.id…
-code放在当前使用函数的位置)。使用函数而不是嵌套查询有什么特殊原因吗?如果您问为什么没有“使用索引”在解释中,这是因为您选择了所有列,mysql无法从索引中获取所有值。你可以使用where,这意味着你基本上是可以的(尽管使用这种函数不是很好),我认为问题是查询没有使用索引,因为在可能的键和键列中有
NULL
。@matino事实上没有NULL。我更改了表定义以反映这一点,结果是相同的。将函数声明为
确定性
(将单词
确定性
放在
开始
之前)。或者,最好不要为此使用函数并在子查询中计算值(您基本上可以将
从tb1 a中选择a.id…
-code放在您当前使用函数的位置)。