Von Ihrer Definition oben, und die ausführlichen Monolog in dieser Antwort unten ich die folgende Änderung vorschlagen:
CREATE TABLE IF NOT EXISTS `bestillinger` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`bestilling` TEXT NOT NULL,
`hashcode` CHAR(32) AS (MD5(bestilling)),
`accepted` VARCHAR(255) DEFAULT NULL,
UNIQUE KEY `id_bestilling` (hashcode,bestilling(333))
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
, die maximale Standardlänge für einen einspaltigen Indexschlüssel ist 1000 Bytes lang (767 bytes for InnoDB tables, es sei denn, Sie haben innodb_large_prefix gesetzt). Die gleiche Länge gilt für jedes Indexschlüssel-Präfix (die ersten N Zeichen für CHAR, VARCHAR, TEXT oder die ersten N Bytes für BINARY, VARBINARY, BLOB). Beachten Sie die Differenz zwischen Zeichen und Byte. Unter der Annahme eines UTF-8-Zeichensatzes und maximal 3 Bytes für jedes Zeichen könnten Sie dieses Limit mit einem Spaltenpräfixindex von mehr als 333 Zeichen in einer TEXT- oder VARCHAR-Spalte erreichen. In der Praxis ist 333 für mich ein guter Maximalwert.
Similarly in SQL Server, gibt es eine 900-Byte-Grenze für die maximale Gesamtgröße aller Indexschlüsselspalten.
Aber das verwendet nur die ersten Zeichen Ihres TEXT als Ihr Schlüssel, mit den offensichtlichen Kollisionen unmittelbar bevorstehend.
In der angenommenen Antwort ist der Vorschlag, eine FULLTEXT index zu verwenden. Ein FULLTEXT-Index ist speziell für die Textsuche entwickelt worden und hat eine nicht so gute Leistung für INSERT/DELETE, da er ein N-Gramm über dem Vokabular der Spaltenaufzeichnungen behält und den resultierenden Vektor speichert. Dies würde funktionieren, wenn jede Operation Textsuchfunktionen in einer Where-Klausel verwenden würde ... aber nicht für einen eindeutigen Index. Es gibt auch einen Primärschlüssel und einen eindeutigen Schlüssel, die auf "id" definiert sind, was redundant erscheint oder die Absicht verfehlt.
Stattdessen schlage ich einen berechneten Hash vor. Sie würden richtigerweise darauf hinweisen, dass es eine Chance gibt (Birthday Paradox), dass es eine Kollision mit einem Hash geben wird, also reicht ein UNIQUE Index allein nicht aus. Wir werden es mit einem Spaltenpräfix-Index verbinden, wie oben beschrieben, um uns an die Einzigartigkeit zu glauben.
entnehme ich die Absicht Ihrer ID-Spalte ist die richtigen Fremdschlüsselverweise aus anderen Tabellen zu ermöglichen. Ganz richtig, aber dann wäre das der nützlichere Primärschlüssel für diese Tabelle. Außerdem bezieht sich int (11) auf die Anzeigebreite der Spalte und nicht auf den zugrunde liegenden Wert. Ich habe auch ein 'unsigned auto_increment' auf 'id' gesetzt, um seine Rolle für das größere Publikum zu verdeutlichen.
Und das bringt uns zu dem vorgeschlagenen Entwurf oben.
ist wirklich gute Erklärung, wie mit vorangestelltem Indizes beschäftigen: http://code-epicenter.com/prefixed-index-in-mysql-database/ – MrD