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

вътрешно присъединяване изберете (A,B) на A и B срещу където (A,B) в select(A, B) в mysql

Не е толкова лесно да се отговори на този въпрос. Трябва да знаете едно важно нещо:MySQL третира IN (<static values list>) и IN (<subquery>) като различни заявки . Първият е равен на сравнение на диапазони (като .. OR = .. OR = ), докато секундата е равна на = ANY () - и не е същото. Така че, казано накратко:използвайки IN с подзаявка ще предизвика заявка с ANY() и MySQL няма да използва индекс за това, дори ако подзаявката е независима и връща статичен списък със стойности . Тъжно, но истина. MySQL не може да предвиди това и така индексът няма да се използва, дори ако е очевидно. Ако ще използвате JOIN (т.е. пренапишете своя IN (<subquery>) ) - тогава MySQL ще използва индекс за JOIN условие, ако е възможно.

Сега, вторият случай може да е за JOIN и IN при използване на дялове. Ако ще използвате JOIN - тогава, за съжаление - но MySQL също не е в състояние да предвиди дялове за JOIN в общия случай - и ще използва целия набор от дялове за него. Замяна на JOIN до IN (<static list>) ще промени EXPLAIN PARTITION картина:MySQL ще използва само онези дялове, които са необходими за избор на стойности от диапазон, посочени в IN клауза. Но, отново, това няма да работи с IN (<subquery>) .

Като заключение - тъжно е, когато говорим за това как MySQL се справя с IN подзаявки - и в общия случай не може да бъде заменен с JOIN безопасно (това е за случая на разделяне). И така, общото решение ще бъде:отделете подзаявката от основната заявка на ниво приложение . Ако говорим за независима подзаявка, връщаща списък със статични стойности, това е най-доброто предложение - тогава можете да замените този списък със стойности като IN(<static list>) и да спечелите предимства:MySQL ще използва индекс за него и, ако говорим за дялове, ще се използва само действително необходими от тях.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да промените паролата за root акаунт на MySQL на CentOS7?

  2. Използване на присъединяване с групирани редове с данни

  3. Как да импортирам дъмп на mysql, докато преименуваш някои таблици/колони и изобщо не импортираш други?

  4. MySQL CONVERT_TZ()

  5. Как мога да създам работа или събитие в mysql