首页 > 解决方案 > 使用 LIKE 子句时出现索引异常?

问题描述

我正在调用mysqli_report(MYSQLI_REPORT_ALL)我的服务器以启用任何可能需要修复的警告和错误。由于MYSQLI_REPORT_INDEX是继承的,PHP 也报告 bad/no index use

我已经正确设置了我的表,但在使用 LIKE 子句时仍然出现以下异常:

mysqli_sql_exception:查询/准备语句中未使用索引(空)

但是,当使用=代替时LIKE,我不再收到此错误。

这是可以修复的吗?

我的表如下所示:

CREATE TABLE `articles` (
    `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `Title` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',
    PRIMARY KEY (`ID`),
    INDEX `Title` (`Title`)
);

这是我在服务器上测试的代码:

$db = mysqli_connect($Host, $User, $Pass, $Database);

$Stmt = mysqli_stmt_init($db);

// This works
mysqli_stmt_prepare($Stmt, 'SELECT ID FROM articles WHERE Title = ?');
$Title = 'test';
// This doesn't work
mysqli_stmt_prepare($Stmt, 'SELECT ID FROM articles WHERE Title LIKE ?');
$Title = '%test%';

mysqli_stmt_bind_param($Stmt, 's', $Title);
mysqli_stmt_execute($Stmt);
mysqli_stmt_bind_result($Stmt, $ID);
mysqli_stmt_fetch($Stmt);
mysqli_stmt_close($Stmt);

标签: phpmysqlmysqlimariadb

解决方案


这是正常行为。

mysql 索引通过从值的左侧开始索引 N 个字符来工作。

因此,当您这样做时不会使用您的索引:

WHERE Title LIKE '%Test%'

这是因为要匹配的字符串以通配符开头,它表示可变数量的字符。

如果您这样做,将使用该索引:

WHERE Title LIKE 'Test%'

或者当然:

WHERE Title = 'Test'

推荐阅读