it-source

LIKE 절을 사용할 때 인덱스 예외를 적용하시겠습니까?

criticalcode 2022. 10. 21. 22:44
반응형

LIKE 절을 사용할 때 인덱스 예외를 적용하시겠습니까?

mysqli_report(MYSQLI_REPORT_ALL)수정이 필요할 수 있는 경고 및 오류를 활성화합니다.★★MYSQLI_REPORT_INDEX상속된 경우 PHP가 잘못된/인덱스 사용을 보고합니다.

테이블을 올바르게 설정했지만 LIKE 절을 사용하면 다음과 같은 예외가 발생합니다.

mysqli_sql_sql:쿼리/준비된 문에 사용된 인덱스가 없습니다(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);

이것은 정상적인 동작입니다.

mysql 인덱스는 값의 왼쪽부터N글자를 인덱싱하여 동작합니다.

따라서 인덱스는 다음 작업을 수행할 때 사용되지 않습니다.

WHERE Title LIKE '%Test%'

그 이유는 대조하는 문자열이 와일드카드로 시작되기 때문입니다. 와일드카드는 가변 문자 수를 나타냅니다.

인덱스는 다음과 같은 경우에 사용됩니다.

WHERE Title LIKE 'Test%'

또는 물론:

WHERE Title = 'Test'

언급URL : https://stackoverflow.com/questions/53999386/index-exception-when-using-like-clause

반응형