Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego indeks jest używany tylko wtedy, gdy jest wymuszony, ale nie domyślnie?

dla lepszej wydajności możesz spróbować użyć indeksu złożonego opartego na kolumnie zawartej w klauzuli where
i spróbować zmienić klauzulę IN w sprzężeniu wewnętrznym
zakładając, że treść klauzuli IN jest zbiorem stałych wartości możesz użyć union (lub nowej tabeli z potrzebną wartością)

np. używając unii (możesz zrobić coś podobnego, jeśli klauzula IN jest podzapytaniem)

select user_table.colA ,ColB , count(*) as count 
from user_table 
INNER JOIN  ( 
  select 'FIXED1' colA
  union
  select 'FIXED2'
  ....
  union 
  select 'FIXEDX'
  )  t on t.colA = user_table.colA  
where colC >='2019-09-01 00:00:00' 
      and ColB = 17  
group by colA ,ColB;

możesz również dodać indeks złożony do tabeli user_table w kolumnach

   colA, colB, colC

co jest związane z elementem używanym przez optymalizator zapytań mysql, aby wybrać indeks, aby użyć tam kilku aspektów, a dla wszystkich tych optymalizator zapytań przypisze koszt
wszystko, co należy wziąć pod uwagę

  • kolumna związana z klauzulą ​​Where
  • Rozmiar stołów (a nie rozmiar stołów w łączeniu)
  • Oszacowanie, ile wierszy zostanie pobranych (aby zdecydować, czy użyć indeksu, czy po prostu zeskanować tabelę)
  • czy typy danych pasują, czy nie między kolumnami w klauzuli jion i where
  • Użycie funkcji lub konwersji typu danych, w tym niezgodność sortowania
  • Rozmiar indeksu
  • liczność indeksu

i dla wszystkich tych opcji wyceniany jest koszt i to prowadzi do indeksu wybierz

W twoim przypadku colC jako data może oznaczać konwersję danych (przestrzegaj wartości literałów jako string) i do tego indeks nie jest wybrany ..

W tym celu zasugerowałem również indeks złożony z kolumną po lewej stronie odnoszącą się do nieprzekonwertowanych wartości



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak naprawić uszkodzoną tabelę

  2. Jak odczytać zapytanie sql do ramki danych pandas / python / django

  3. odwoływać się do kolumn z automatycznym przyrostem?

  4. Grupuj według max(czasu) mysql

  5. Czy mogę w pełni zapobiec wstrzykiwaniu SQL za pomocą instrukcji PDO Prepared bez bind_param?