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