In 查询及其优化

translator

  • Afrikaans
  • Albanian - shqipe
  • Arabic - ‎‫العربية‬‎
  • Armenian - Հայերէն
  • Azerbaijani - azərbaycanca
  • Basque - euskara
  • Belarusian - беларуская
  • Bengali - বাংলা
  • Bulgarian - български
  • Catalan - català
  • Chinese - 中文(简体中文)
  • Chinese - 中文 (繁體中文)
  • Croatian - hrvatski
  • Czech - čeština
  • Danish - dansk
  • Dutch - Nederlands
  • English
  • Esperanto - esperanto
  • Estonian - eesti
  • Filipino
  • Finnish - suomi
  • French - français
  • Galician - galego
  • Georgian - ქართული
  • German - Deutsch
  • Greek - Ελληνικά
  • Gujarati - ગુજરાતી
  • Haitian Creole - kreyòl ayisyen
  • Hebrew - ‎‫עברית‬‎
  • Hindi - हिन्दी
  • Hungarian - magyar
  • Icelandic - íslenska
  • Indonesian - Bahasa Indonesia
  • Irish - Gaeilge
  • Italian - italiano
  • Japanese - 日本語
  • Kannada - ಕನ್ನಡ
  • Korean - 한국어
  • Latin - Lingua Latina
  • Latvian - latviešu
  • Lithuanian - lietuvių
  • Macedonian - македонски
  • Malay - Bahasa Melayu
  • Maltese - Malti
  • Norwegian - norsk
  • Persian - ‎‫فارسی‬‎
  • Polish - polski
  • Portuguese - português
  • Romanian - română
  • Russian - русский
  • Serbian - Српски
  • Slovak - slovenčina
  • Slovenian - slovenščina
  • Spanish - español
  • Swahili - Kiswahili
  • Swedish - svenska
  • Tamil - தமிழ்
  • Telugu - తెలుగు
  • Thai - ไทย
  • Turkish - Türkçe
  • Ukrainian - українська
  • Urdu - ‎‫اردو‬‎
  • Vietnamese - Tiếng Việt
  • Welsh - Cymraeg
  • Yiddish - יידיש
    Double-click
    Select to translate

in 和 exist关键字

In

  1. 在8.0版本中,mysql优化器会去计算走索引要扫描的行数和时间(如果要回表,则还要计算回表的效率)与走全表扫描的时间,从而选择。
  2. 为了防止发生死锁和重复,mysql优化器选择排序条件后的范围查询。
  3. 所以,in条件少,(扫描的row少),一般走索引,条件多,则不走索引。但是如果使用到了联合索引,发生覆盖索引查询,一般都会比全表扫描的时间要短。(同理,使用主键索引不用回表一般也会使用主键索引)
  4. in条件只有一个会转化成条件查询 =,使用到了索引。其次可能用到的是range, index(索引的全表扫描),all。

结论:in一般会走索引,但是当范围过大,回表次数过多,索引会失效(二级索引)。但是如果查询符合覆盖索引或者查询条件为主键索引(不回表效率肯定高)的,那么,一定会用到索引。

子查询

执行顺序不同,in先执行子查询,exists先执行父查询。

子查询优化

大多数的(in)子查询优化为join, 当in数据量大的时候,子查询会产生临时表,导致索引失效,查询性能降低。

注意:优化的SQL有一定的局限性,不是所有的子查询都可以用join优化,如存在union, group by, order by, limit 等一般不用join,当SQL较为简单才可以优化。

网址链接:https://www.bilibili.com/video/BV16H4y127kC/?spm_id_from=444.41.list.card_archive.click&vd_source=75bb2f53d007e412f0a191bb12a6e62c