Дефиниране на MySQL без изрично първичните ключове е много много лоша идея.
Ако липсва PK, MySQL ще създаде имплицитен (но много реален) целочислен автоматично нарастващ първичен ключ.
Този PK ще бъде включен във всеки вторичен ключ в InnoDB и ще определи вашия първичен ред на сортиране в MyISAM.
Последствие
Току-що забавихте производителността на всяко избиране, вмъкване и актуализиране.
Без цел каквото и да било.
InnoDB:необходимо е допълнително търсене, за да стигнете до данни от таблица
В InnoDB трябва да се направи допълнително търсене, защото всички вторични индекси се отнасят към PK, а не към самите редове.
MyISAM:пропиляно място
В MyISAM наказанието не е толкова голямо, но все още плъзгате неизползвано поле от 4 байта, което не се използва.
InnoDB + MyISAM:Безполезно генериране на поле за автоматично увеличение
Тъй като се създава имплицитен автоинкрементиращ PK и вие също се нуждаете от допълнителен ключ за автоматично нарастване, за да правите обединения; За да предотвратите дублиране на полета за автоматично нарастване, вече имате не 1, а 2 заключвания на таблица на вмъкване.
InnoDB:с присъединява се удвоява споменатата по-горе задача за търсене
Ако направите присъединяване, използвайки поле, което не е PK, InnoDB трябва да направи допълнително търсене на присъединяване за да стигнете до записите на тази друга маса.
InnoDB:най-лошото е, че губите ползата от покриване на индекси
Деактивирахте една от най-добрите оптимизации в InnoDB, обхващаща индекси.
Ако MySQL може да разреши заявката, използвайки само данните в индексите, тя никога няма да прочете таблицата, това ще доведе до значителна скорост печалба. Сега, когато 50% от всеки индекс в InnoDB е неизползвано пространство, вие току-що намалихте шансовете си тази оптимизация да бъде използвана.
Моля, победете този изпълнител с улика!
Връзки:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
(бавна връзка, но препоръчваме да прочетете).
O'Reilly за покриващите индекси на InnoDB
http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB
Достоверно , ако вашият изпълнител каже, няма голямо значение, защото той използва MyISAM, победете го отново, винаги трябва да използвате InnoDB, освен ако нямате основателна причина също.
InnoDB е много по-безопасен в производството, MyISAM има своите използва, но се поврежда твърде лесно.