2013-05-15 16 views
12

Esiste una dimensione massima di un indice UNIQUE in MySQL? Ho sei dimensioni nel mio indice, che porta a un indice massiccio. Esiste un limite di cardinalità sull'indice UNIQUE?Dimensione massima dell'indice UNIQUE in MySQL

Sto ricevendo strani errori inspiegabili e mi chiedo se c'è un limite dallo UNIQUE. Potrebbe provenire da un limite di unicità? Ecco come appare (anche io non capisco perché la cardinalità delle ultime tre colonne non aumenta).

+-------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| table |   0 | PRIMARY |   1 | column_1  | A   |   15 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   2 | column_2  | A   |  91948 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   3 | column_3  | A   |  924889 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   4 | column_4  | A   | 15723114 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   5 | column_5  | A   | 15723114 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   6 | column_6  | A   | 15723114 |  NULL | NULL |  | BTREE  |   |    | 
+-------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
+1

Hai sei vincoli unici su un unico tavolo ?! Potrebbe essere un'indicazione che c'è qualcosa di sbagliato nel design ;-) –

+0

Quante righe ha attualmente il tuo tavolo? È MyISAM o InnoDB? – Jocelyn

+0

Sì, d'accordo. Lo aggiusterò rafforzando l'unicità altrove. Tuttavia, ha sollevato un punto che io sono curioso circa la dimensione massima dell'indice. –

risposta

13

Per le tabelle InnoDB, il limite è 3072 byte attraverso tutte le colonne indicizzate, presumibilmente prendendo solo i primi 767 byte di ogni colonna.

Una chiave di indice per un indice a colonna singola può essere fino a 767 byte. Lo stesso limite di lunghezza si applica a qualsiasi prefisso della chiave dell'indice. Vedere la Sezione 13.1.13, "CREATE INDEX Sintassi".

La lunghezza massima interna della chiave InnoDB è 3500 byte, ma lo stesso MySQL limita questo valore a 3072 byte. Questo limite si applica alla lunghezza della chiave indice combinata in un indice a più colonne.

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html

Così, basata esclusivamente sulla documentazione, direi che si potrebbe avere fino a 1000 colonne nel tuo indice (il numero massimo di colonne in una tabella InnoDB), a condizione che la dimensione media di ciascuno è 3 byte o meno.

Per le tabelle MyISAM, è il minore di 16 colonne o 1000 byte.

Il numero massimo di colonne per indice è 16.

La lunghezza massima della chiave è 1000 byte. Questo può anche essere modificato da cambiando la fonte e ricompilando. Per il caso di una chiave più lunga di 250 byte, una dimensione del blocco chiave più grande del valore predefinito di 1024 byte è utilizzata.

http://dev.mysql.com/doc/refman/5.0/en/myisam-storage-engine.html

+0

In realtà dice "Limitazioni UNIQUE di lunghezza arbitraria" – Tom

+1

@Tom Interessante ... Sarei interessato a una spiegazione più completa di cosa significhi. Nella maggior parte dei contesti, arbitrario generalmente non significa "con disprezzo per i limiti", ma piuttosto "qualsiasi valore di capriccio entro i limiti". – svidgen

Problemi correlati