【问题标题】:Index exception when using LIKE clause?使用 LIKE 子句时出现索引异常?
【发布时间】:2019-05-28 16:34:36
【问题描述】:

我正在我的服务器上调用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);

【问题讨论】:

    标签: php mysql mysqli mariadb


    【解决方案1】:

    这是正常现象。

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

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

    WHERE Title LIKE '%Test%'
    

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

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

    WHERE Title LIKE 'Test%'
    

    当然也可以:

    WHERE Title = 'Test'
    

    【讨论】:

    • 在大多数情况下,Title LIKE 'Test'(无通配符)被优化为Title = 'Test'。
    猜你喜欢
    • 2017-04-24
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2021-06-16
    • 2011-04-09
    • 2022-07-07
    相关资源
    最近更新 更多