2010-10-26 24 views
5

我有以下查詢:MySQL二進制比較犯規利用指數

EXPLAIN EXTENDED SELECT * 
FROM (
`photo_data` 
) 
LEFT JOIN `deleted_photos` ON `deleted_photos`.`photo_id` = `photo_data`.`photo_id` 
WHERE photo_data.photo_id = 'UKNn' 
AND `deleted_photos`.`photo_id` IS NULL 

我很遺憾不得不使用二進制比較這photo_id(這被交給我從不同的外部服務)。這樣我就可以避免將'uknn'從數據庫中取出,而不是'UKNn'。

問題是,當我做解釋時,我看到使用二進制不使用索引。如果我取出二進制文件,它使用photo_id的索引。有沒有辦法可以使用二進制選項並使用它的索引?

回答

4

MySQL使用索引的列的排序規則。由於順序可能不同,因此具有非二進制排序規則的索引對二進制查找無用。

你可以列本身變成二進制排序:

ALTER TABLE YourTable MODIFY 
    YourColumn VARCHAR(4) 
    CHARACTER SET latin1 
    COLLATE latin1_bin; 

那麼指數將一個二進制的查找是有用的。

2

如果您只需要以區分大小寫的方式比較字段值 - 您可以專門更改該字段的排序規則。

ALTER TABLE photo_data MODIFY photo_id VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_bin 

ALTER TABLE photo_data MODIFY photo_id VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_general_cs 
+0

有沒有辦法接受你的答案?你們幾乎在同一時間有相同的答案 – 2010-10-26 15:33:32