Php 使用LIKE子句时索引异常?
我正在我的服务器上调用Php 使用LIKE子句时索引异常?,php,mysql,mysqli,mariadb,Php,Mysql,Mysqli,Mariadb,我正在我的服务器上调用mysqli\u report(mysqli\u report\u ALL),以启用可能需要修复的任何警告和错误。由于继承了MYSQLI\u REPORT\u INDEX,PHP也被继承 我已正确设置了表,但使用LIKE子句时仍会出现以下异常: mysqli_sql_异常:查询/准备语句中未使用索引(null) 但是,当使用=而不是像那样使用时,我不再收到此错误 这能修好吗 我的桌子看起来像这样: CREATE TABLE `articles` ( `ID` INT
mysqli\u report(mysqli\u report\u ALL)
,以启用可能需要修复的任何警告和错误。由于继承了MYSQLI\u REPORT\u INDEX
,PHP也被继承
我已正确设置了表,但使用LIKE子句时仍会出现以下异常:
mysqli_sql_异常:查询/准备语句中未使用索引(null)
但是,当使用=
而不是像那样使用时,我不再收到此错误
这能修好吗
我的桌子看起来像这样:
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);
这是正常的行为
mysql索引从值的左侧开始索引N个字符
因此,在执行以下操作时,不会使用索引:
WHERE Title LIKE '%Test%'
这是因为要匹配的字符串以一个通配符开头,它表示可变的字符数
如果您执行以下操作,将使用索引:
WHERE Title LIKE 'Test%'
或者当然:
WHERE Title = 'Test'
在大多数情况下,标题如“Test”
(无通配符)被优化为标题=“Test”
。