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

MySQL дефинира колоната като UNIQUE с AUTO_INCREMENT вместо като първичен ключ

Дефиниране на 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 има своите използва, но се поврежда твърде лесно.



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

  2. Cheat Sheet за производителността на MySQL

  3. Laravel:PDOException:не можа да намери драйвер

  4. Mysql:ГРЕШКА 1005 (HY000):Не може да се създаде таблица 'receitascakephp.recipes' (errno:150)

  5. Грешка в MySQL/Amazon RDS:нямате СУПЕР привилегии...