Petite anti-astuce :Utiliser des fonctions dans les conditions sur un champs indexé, annule l'utilisation de l'index

mysql> EXPLAIN SELECT * FROM film WHERE title LIKE 'Tr%'\\G 
*************************** 1. row *************************** 
id: 1 
select_type: SIMPLE 
table: film 
type: range 
possible_keys: idx_title 
key: idx_title 
key_len: 767 
ref: NULL 
rows: 15 
Extra: Using where

Une stratégie d'accès rapide à un range est choisi par l'optimiseur, et l'index sur le titre est utilisé pour réduire la quantité d'enregistrements à examiner (ici 15)

mysql> EXPLAIN SELECT * FROM film WHERE LEFT(title,2) = 'Tr' \\G 
*************************** 1. row *************************** 
id: 1 
select_type: SIMPLE 
table: film type: ALL 
possible_keys: NULL 
key: NULL 
key_len: NULL 
ref: NULL 
rows: 951 
Extra: Using where

Une analyse complète des enregistrement, donc lente, (c'est la stratégie d'accès ALL) est utilisée car une fonction (LEFT) opére sur la colonne de titre dans la condition.


source Join-fu: The Art of SQL Tuning for MySQL