Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL не използва индекси (Използване на файлово сортиране), когато използва ORDER BY

В този случай не можете да използвате индекс, тъй като използвате RANGE състояние на филтриране.

Ако използвате нещо като:

SELECT  *
FROM    values_table this_
WHERE   this_.value1 = @value
ORDER BY
        value2
LIMIT 10

, след което създаване на съставен индекс на (VALUE1, VALUE2) ще се използва както за филтриране, така и за подреждане.

Но вие използвате условие с диапазон, затова все пак ще трябва да извършите поръчка.

Вашият съставен индекс ще изглежда така:

value1 value2
-----  ------
1      10
1      20
1      30
1      40
1      50
1      60
2      10
2      20
2      30
3      10
3      20
3      30
3      40

и ако изберете 1 и 2 в value1 , все още не получавате цял сортиран набор от value2 .

Ако вашият индекс на value2 не е много селективен (т.е. няма много DISTINCT value2 в таблицата), можете да опитате:

CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)

/* Note the order, it's important */    

SELECT  *
FROM    (
        SELECT  DISTINCT value2
        FROM    mytable
        ORDER BY
                value2
        ) q,
        mytable m
WHERE   m.value2 >= q.value2
        AND m.value2 <= q.value2
        AND m.value1 BETWEEN 13123123 AND 123123123

Това се нарича SKIP SCAN метод за достъп. MySQL не го поддържа директно, но може да се емулира по този начин.

RANGE достъпът ще бъде използван в този случай, но вероятно няма да получите полза от производителността, освен ако DISTINCT value2 съдържат по-малко от около 1% от редове.

Обърнете внимание на използването на:

m.value2 >= q.value2
AND m.value2 <= q.value2

вместо

m.value2 = q.value2

Това прави MySQL изпълнява RANGE проверка на всеки цикъл.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изразяване на казус срещу изявление на казус

  2. Как мога да възстановя пълните привилегии на root потребителя на MySQL?

  3. колона за актуализиране на mysql със стойност от друга таблица

  4. WEEKDAY() Примери – MySQL

  5. Какъв вид хеш използва mysql?