13.1.4. CREATE INDEX
Syntax
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type
]
ON tbl_name
(index_col_name
,...)
[WITH PARSER parser_name
]
index_col_name
:
col_name
[(length
)] [ASC | DESC]
CREATE INDEX
is mapped to an ALTER
TABLE
statement to create indexes. See
Section 13.1.2, “ALTER TABLE
Syntax”. For more information about how
MySQL uses indexes, see Section 7.4.5, “How MySQL Uses Indexes”.
Normally, you create all indexes on a table at the time the
table itself is created with CREATE TABLE
.
See Section 13.1.5, “CREATE TABLE
Syntax”. CREATE
INDEX
enables you to add indexes to existing tables.
A column list of the form (col1,col2,...)
creates a multiple-column index. Index values are formed by
concatenating the values of the given columns.
For CHAR
, VARCHAR
BINARY
, and VARBINARY
columns, indexes can be created that use only part of a column,
using
col_name
(length
)
syntax to specify an index prefix length. Index entries consist
of the first length
characters of
each column value for CHAR
and
VARCHAR
columns, and the first
length
bytes of each column value for
BINARY
and VARBINARY
columns. BLOB
and TEXT
columns also can be indexed, but a prefix length
must be given.
The statement shown here creates an index using the first 10
characters of the name
column:
CREATE INDEX part_of_name ON customer (name(10));
If names in the column usually differ in the first 10
characters, this index should not be much slower than an index
created from the entire name
column. Also,
using partial columns for indexes can make the index file much
smaller, which could save a lot of disk space and might also
speed up INSERT
operations.
Prefixes can be up to 1000 bytes long (767 bytes for
InnoDB
tables). Note that prefix limits are
measured in bytes, whereas the prefix length in CREATE
INDEX
statements is interpreted as number of
characters for non-binary data types (CHAR
,
VARCHAR
, TEXT
). Take this
into account when specifying a prefix length for a column that
uses a multi-byte character set.
In MySQL 5.1:
You can add an index on a column that can have
NULL
values only if you are using the
MyISAM
, InnoDB
,
BDB
, or MEMORY
storage
engine.
You can add an index on a BLOB
or
TEXT
column only if you are using the
MyISAM
, BDB
, or
InnoDB
storage engine.
An index_col_name
specification can
end with ASC
or DESC
.
These keywords are allowed for future extensions for specifying
ascending or descending index value storage. Currently, they are
parsed but ignored; index values are always stored in ascending
order.
Some storage engines allow you to specify an index type when
creating an index. The syntax for the
index_type
specifier is
USING type_name
.
The allowable type_name
values
supported by different storage engines are shown in the
following table. Where multiple index types are listed, the
first one is the default when no
index_type
specifier is given.
Examples:
CREATE TABLE lookup (id INT) ENGINE = MEMORY;
CREATE INDEX id_index USING BTREE ON lookup (id);
TYPE type_name
can
be used as a synonym for USING
type_name
to specify an
index type. However, USING
is the preferred
form. In addition, the index name that precedes the index type
in the index specification syntax is not optional with
TYPE
: Unlike USING
,
TYPE
is not a reserved word and thus is
interpreted as an index name.
If you specify an index type that is not legal for a given
storage engine, but there is another index type available that
the engine can use without affecting query results, the engine
uses the available type.
FULLTEXT
indexes are supported only for
MyISAM
tables and can include only
CHAR
, VARCHAR
, and
TEXT
columns. See
Section 12.7, “Full-Text Search Functions”. A WITH
PARSER
clause can be specified to associate a parser
plugin with the index if full-text indexing and searching
operations need special handling. This clause is legal only for
FULLTEXT
indexes. See
Section 27.2, “The MySQL Plugin Interface”, for details on creating plugins.
SPATIAL
indexes are supported only for
MyISAM
tables and can include only spatial
columns that are defined as NOT NULL
.
Chapter 18, Spatial Extensions, describes the spatial data
types.