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

MySQL definující sloupec jako UNIQUE s AUTO_INCREMENT namísto primárního klíče

Definování MySQL bez explicitního primární klíče je velmi špatný nápad.
Pokud PK chybí, MySQL vytvoří implicitní (ale velmi skutečný) celočíselný autoinkrementační primární klíč.
Tento PK bude zahrnut v každém sekundárním klíči v InnoDB a určí vaše primární pořadí řazení v MyISAM.

Následek
Právě jste zpomalili výkon každého výběru, vložení a aktualizace.
Za žádným účelem.

InnoDB:k získání dat tabulky je vyžadováno další vyhledávání
V InnoDB je třeba provést další vyhledávání, protože všechny sekundární indexy odkazují na PK a ne na samotné řádky.

MyISAM:plýtvání místem
V MyISAM není penalizace tak velká, ale stále přetahujete 4bajtové nevyužité pole, které se nepoužívá.

InnoDB + MyISAM:zbytečné generování pole automatického přírůstku
Protože se vytvoří implicitní autoinkrementační PK a k provádění spojení jste také potřebovali další autoinkrementační klíč; Aby se předešlo duplicitním polím automatického přírůstku, máte nyní ne 1, ale 2 zámky tabulky na vložku.

InnoDB:s připojeními se výše zmíněný vyhledávací problém zdvojnásobuje
Pokud provedete spojení pomocí pole, které není PK, InnoDB musí provést další vyhledávání za spojení abyste se dostali k záznamům té druhé tabulky.

InnoDB:nejhorší ze všeho je, že ztratíte výhodu pokrytí indexů
Vypnuli jste jednu z nejlepších optimalizací v InnoDB, pokrývající indexy.
Pokud MySQL dokáže vyřešit dotaz pouze pomocí dat v indexech, nikdy nepřečte tabulku, bude to mít za následek značnou rychlost získat. Nyní, když je 50 % každého indexu v InnoDB nevyužitý prostor, právě jste smazali své šance na využití této optimalizace.

Porazte tohoto dodavatele vodítkem!

Odkazy:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (pomalý odkaz, ale doporučujeme přečíst).
O'Reilly na krycích indexech InnoDB http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW , pokud váš dodavatel říká, že na tom moc nezáleží, protože používá MyISAM, porazte ho znovu, měli byste vždy používat InnoDB, pokud k tomu nemáte dobrý důvod.
InnoDB je ve výrobě mnohem bezpečnější, MyISAM má své používá, ale příliš snadno se poškodí.



  1. zahrnout třídu Jfactory do externího souboru php, Joomla

  2. Jak anotovat pole automatického přírůstku MYSQL pomocí anotací JPA

  3. Jak spustit aplikaci spring-boot bez závislosti na databázi?

  4. MySQL časové razítko vyberte časové období