sql >> Databáze >  >> RDS >> Mysql

Proč je výkon dotazů MySQL tak špatný při použití indexu CHAR/VARCHAR?

Je zřejmé, že problém je v tom, že dotaz provádí skenování indexu. Alternativním přístupem by bylo provést dvě vyhledávání indexu, pro první a poslední hodnotu, které jsou stejné, a poté použít metainformace v indexu pro výpočet. Na základě vašich pozorování MySQL dělá obojí.

Zbytek této odpovědi jsou spekulace.

Důvodem, proč je výkon „jen“ 300krát pomalejší, spíše než 200 000krát pomalejší, je režie při čtení indexu. Ve skutečnosti je skenování záznamů poměrně rychlé v porovnání s jinými operacemi, které jsou potřeba.

Mezi čísly a řetězci je zásadní rozdíl, pokud jde o srovnání. Engine se může jen podívat na bitové reprezentace dvou čísel a rozpoznat, zda jsou stejná nebo různá. Bohužel u řetězců je potřeba počítat s kódováním/kolováním. Myslím, že proto je třeba se podívat na hodnoty.

Je možné, že pokud jste měli 216 000 kopií přesně stejný řetězec, pak by MySQL bylo schopné provést počítání pomocí metadat v indexu. Jinými slovy, indexátor je dostatečně chytrý, aby používal metadata pro přesná srovnání rovnosti. Není však dostatečně chytrý, aby vzal v úvahu kódování.



  1. Upozornění PHP:mysql_query() očekává, že parametr 1 bude řetězec

  2. Oprávnění odepřeno uvnitř /var/www/html při vytváření webu a jeho souborů se serverem apache2

  3. Jak zadat číslo portu v připojovacím řetězci SQL Server?

  4. 2 způsoby, jak získat informace o oddílu pro tabulku v SQL Server (T-SQL)