php - 使用 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);
解决方案
这是正常行为。
mysql 索引通过从值的左侧开始索引 N 个字符来工作。
因此,当您这样做时不会使用您的索引:
WHERE Title LIKE '%Test%'
这是因为要匹配的字符串以通配符开头,它表示可变数量的字符。
如果您这样做,将使用该索引:
WHERE Title LIKE 'Test%'
或者当然:
WHERE Title = 'Test'
推荐阅读
- javascript - 在 amcharts4 中的气泡图中的气泡下标记
- c# - '无法加载文件或程序集 'Microsoft.ServiceBus, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一
- php - 在下一个工作日发生之前修改日期时间对象并保留原始日期的小时和分钟
- php - PHP将多行csv文件读取到变量
- r - R:测试一个可能不存在的变量
- python - 无法在 python matplotlib 中设置图形 gid
- python - 在php中执行fontforge
- javascript - 从视图处理 toFormData
- json - 有没有办法在python的循环中存储列表值
- html - 使用 flex-direction 列避免 flex 子元素的宽度相同