J'ai une table avec 150k lignes de données, et j'ai une colonne avec un UNIQUE INDEX, il a un type de VARCHAR(10) et stocke des numéros de compte à 10 chiffres.

Maintenant, chaque fois que je demande, comme une simple:

SELECT * FROM table WHERE account_number LIKE '0103%'

Il en résulte plus de 30000 ROWS, et lorsque j'exécute un EXPLAIN sur ma requête, il montre qu'aucun INDEX n'est utilisé.

Mais quand je fais:

SELECT * FROM table WHERE account_number LIKE '0104%'

Il en résulte 4000+ RANGÉES, avec l'INDEX utilisé.

N'importe qui peut expliquer cela?

I'm using MySQL 5.7 Percona XtraDB.

1
John Pangilinan 9 août 2017 à 16:35

2 réponses

La plupart des bases de données utilisent l'arbre B pour l'indexation. Dans ce cas, l'optimiseur de base de données n'utilise pas l'index car il est plus rapide à analyser sans index. Comme @ lad2025 expliqué.

Votre colonne de base de données est unique et je pense que votre cardinalité de votre index est élevée. Mais comme votre requête utilisant le filtre similaire, l'optimiseur de base de données décide de ne pas utiliser l'index.

Vous pouvez utiliser l'index try force pour voir le résultat. Votre utilisation de varchar avec un index unique. Je choisirais un autre type de données ou changerais votre type d'index. Si votre tableau ne contient que des nombres, changez-le en nombres. Cela vous aidera à optimiser votre requête.

Dans certains cas, lorsque vous devez utiliser comme, vous pouvez utiliser l'index de texte intégral.

Si vous avez besoin d'aide pour optimiser votre requête et votre table. Fournissez-nous plus d'informations et les informations que vous souhaitez extraire de votre table.

1
Noob 9 août 2017 à 13:52

Lad2025 est correct. La base de données tente de faire une optimisation intelligente.

Benchmark avec:

SELECT * FROM table FORCE INDEX(table_index) WHERE account_number LIKE '0103%'  

Et voyez qui est le plus intelligent :-) Vous pouvez toujours essayer de remettre en question l'optimiseur. C'est à cela que servent les indices d'index ...
https://dev.mysql.com/doc/refman/ 5.7 / fr / index-hints.html

1
MarCPlusPlus 9 août 2017 à 14:01