Исключение индекса при использовании предложения LIKE? - PullRequest
0 голосов
/ 02 января 2019

Я звоню mysqli_report(MYSQLI_REPORT_ALL) на моем сервере, чтобы включить любые предупреждения и ошибки, которые могут потребоваться исправить.Поскольку MYSQLI_REPORT_INDEX наследуется, PHP также сообщает о неправильном / нет использования индекса .

Я правильно настроил свою таблицу, но все равно получаю следующее исключение при использовании предложения LIKE:

mysqli_sql_exception: индекс не используется в запросе / подготовленном операторе (null)

Однако при использовании = вместо 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 голосов
/ 02 января 2019

Это нормальное поведение.

индексы mysql работают, индексируя N символов, начиная слева от значения.

Как следствие, ваш индекс не используется, когда вы делаете:

WHERE Title LIKE '%Test%'

Это потому, что соответствующая строка начинается с подстановочного знака, который представляет переменное количество символов.

Индекс будет использоваться, если вы выполните:

WHERE Title LIKE 'Test%'

Или, конечно:

WHERE Title = 'Test'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...