Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfrageoptimierung von LIKE term% ORDER BY int

Sie haben eine andere Frage gestellt:"Erstellen eines Index, der sich am besten für die Suche mit Platzhaltern in 40 Millionen Namen eignet". Okay, Sie haben 40 Millionen Datensätze.

Betrachten Sie nun folgende Formel:

x = COUNT(DISTINCT values in a column) / COUNT(values in a column)

Ein Index auf einer Spalte ist umso besser, je näher x liegt auf 1 ist. Wenn es 1 ist, sind alle Werte verschieden, es gibt keine Duplikate und ein Index ist daher ziemlich schnell.

Jetzt suchen Sie nach „john%“. Das sind 4 Buchstaben und ein offenes Ende. Welche Buchstaben sind nicht wichtig, Ihre DB muss mit 26 * 26 * 26 * 26 =456976 unterschiedlichen Werten umgehen. Setzen Sie das in die obige Formel und Ihre 40 Millionen Datensätze ein. Sie erhalten ein x von 0,0114244.

Ich weiß nicht, was der Schwellenwert ist, aber IIRC ist 0,1 oder so. Also, wenn Sie x sind ist über 0,1 wird der Index verwendet, ist er kleiner, wird er nicht verwendet.

Warum ist das so? Die Verwendung eines Indexes kann die Dinge sogar verlangsamen, da Ihre Datenbank den Index ansehen muss, in diesem Index sehen muss, an welcher Position auf Ihrer physischen Festplatte sich der entsprechende Datensatz befindet, und dann diesen Datensatz abrufen muss. Wenn x unter 10 % liegt, ist es daher schneller, nur eine ganze Tabelle zu scannen.

Zusammenfassend:Das Filtern von 40 Millionen Datensätzen mit nur einem schwachen Index wie Ihrem ist einfach nutzlos.