使用LIKE子句时索引异常?

时间:2019-01-01 22:20:12

标签: php mysql mysqli mariadb

我正在服务器上呼叫mysqli_report(MYSQLI_REPORT_ALL),以启用可能需要修复的所有警告和错误。由于MYSQLI_REPORT_INDEX是继承的,因此PHP也是reporting 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);

1 个答案:

答案 0 :(得分:2)

这是正常现象。

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

结果,这样做时不会使用您的索引:

WHERE Title LIKE '%Test%'

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

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

WHERE Title LIKE 'Test%'

或者当然是:

WHERE Title = 'Test'
相关问题