Mysql indexes: Difference between revisions

From wikinotes
Line 13: Line 13:
where the values of multiple columns are concatenated together to form one string.
where the values of multiple columns are concatenated together to form one string.


'''order'''<br>
The order of the columns is significant,<br>
The order of the columns is significant,<br>
but there are debates over the optimal ordering.
but there are debates over the optimal ordering.
Line 20: Line 21:


- (unspecific -> specific) TBD
- (unspecific -> specific) TBD
</syntaxhighlight>
'''in single-column queries'''<br>
You can take advantage of a multi-column index for single-column queries,<br>
if your query includes items in the leftmost-to-rightmost order.
For example
<syntaxhighlight lang="yaml">
# we have a multi-column index on (country, province, city)
SELECT ... WHERE country = "CA";                    # CAN use index, query on leftmost column
SELECT ... WHERE country = "CA" AND province = "ON"  # CAN use index, query on each of the two leftmost columns
SELECT ... WHERE proince = "ON";                    # CANNOT use index, queries 2nd column without 1st
</syntaxhighlight>
</syntaxhighlight>
</blockquote><!-- Multi-Column Index -->
</blockquote><!-- Multi-Column Index -->

Revision as of 22:05, 4 September 2022

Indexes use various datastructures to store data to prevent full scans of all rows in the table.

Index Types

Index

A regular index, on a single column. Defaults to BTREE.

Multi-Column Index

A multi-column index is a regular index,
where the values of multiple columns are concatenated together to form one string.

order
The order of the columns is significant,
but there are debates over the optimal ordering.

- (specific -> unspecfic) will create a larger (on disk) tree,
  since there will be duplicates of the unspecific entries

- (unspecific -> specific) TBD

in single-column queries
You can take advantage of a multi-column index for single-column queries,
if your query includes items in the leftmost-to-rightmost order.

For example

# we have a multi-column index on (country, province, city)

SELECT ... WHERE country = "CA";                     # CAN use index, query on leftmost column
SELECT ... WHERE country = "CA" AND province = "ON"  # CAN use index, query on each of the two leftmost columns

SELECT ... WHERE proince = "ON";                     # CANNOT use index, queries 2nd column without 1st

Index Datastructure Types

Show the current index using

SHOW INDEX FROM foo_table;

BTree

A binary tree. Default for persisted storage engines.

Optimize Queries that are

- sorted
- match on field prefixes (but not suffixes)
- range bound (less than 10, between C and F)

But not queries

- match on field suffixes

HASH

A hash table. Default for the memory engine.
hash-collisions are accounted for, but each key with the same hash will need to be checked, making the query more expensive.
Indexes have a small memory footprint.

Optimize queries that are

- based on the full value (ex. 'IN, NOT IN, =')

But not queries that

- match on only a single key from a multi-key index
  (since both keys are hashed together)
- are range bound. (ex. less than 10, betweeen C and F)
  (hash-tables are un-ordered, so range queries are not optimized)

FULLTEXT

Fulltext indexes are optimized for finding keywords within blocks of text.
They are used when the MATCH AGAINST ".." operator is used.
It may still be beneficial to have a second index with a different type on the same column.