我正在服务器上呼叫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);
答案 0 :(得分:2)
这是正常现象。
mysql索引通过从值的左侧开始索引N个字符来工作。
结果,这样做时不会使用您的索引:
WHERE Title LIKE '%Test%'
这是因为要匹配的字符串以通配符开头,该通配符表示可变数量的字符。
如果这样做,将使用索引:
WHERE Title LIKE 'Test%'
或者当然是:
WHERE Title = 'Test'