Mysql index

Post on 11-May-2015

1.122 views 1 download

Tags:

Transcript of Mysql index

MySQL IndexAndy Yao

Friday, December 30, 11

MySQL Basic

Friday, December 30, 11

MySQL Architecture

Friday, December 30, 11

Storage Engine: MyISAM

Table lock

No automated data recovery

No transactions

Only indexes are cached in memory

Compact storage

Friday, December 30, 11

Storage Engine: InnoDB

Transactional

Foreign keys

Multiversioning

Clustered by primary key

No cached count(*)

Blocking AUTO_INCREMENT

Optimized cache

Friday, December 30, 11

InnoDB Storage Architecture Tablespaces

leaf node segment

non-leaf node segment

rollback node segment

Segment

extent

extent

extent

extent

...

Extent

row row

row row

...

PageRow

trx id

row id

roll pointer

col 1 col n... 64 pages

Friday, December 30, 11

InnoDB and File system

 File  system                            -­‐>  InnoDB  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  disk  partition                      -­‐>  tablespace  file                                          -­‐>  segment  inode                                        -­‐>  fsp0fsp.c  'inode'  fs  space  allocation  unit  -­‐>  extent  disk  block                              -­‐>  page  (16  kB)

Friday, December 30, 11

Types of Indexes

Friday, December 30, 11

Types of Indexes

B+Tree indexes

Hash indexes

R-Tree indexes

Full-text indexes

Friday, December 30, 11

B+Tree Indexes

Friday, December 30, 11

Binary search tree

2

3

5

7

6 8

2

3

6

7

85

Binary search tree AVL tree

Friday, December 30, 11

B Tree

25 50 75 ...

5 10 15 20 25 30 50 55 60 65 75 80 85 90

Friday, December 30, 11

B+Tree

25 50 75 ...

5 10 15 20 25 30 50 55 60 65 75 80 85 90

Friday, December 30, 11

B+Tree Indexes

Friday, December 30, 11

B+tree indexes: Demo

CREATE TABLE People (last_name varchar(50) not null,first_name varchar(50) not null,dob date not null,gender enum('m', 'f') not null,

key(last_name, first_name, dob) );

Friday, December 30, 11

B+tree indexes: Demo

Friday, December 30, 11

B+Tree: Types of queries

Match the full value

where last_name=? and first_name=? and bod=?

Match a leftmost prefix

where last_name=?

where last_name=?

Friday, December 30, 11

B+Tree: Types of queries

Match a column prefix

where last_name like ”Liang%”

Match a range of values

where last_name > ?

Friday, December 30, 11

B+Tree: Types of queries

Match one part exactly and match a range on another

where last_name=? and first_name>?

Index only queries

select first_name where last_name=?

Friday, December 30, 11

B+Tree: Limitations

Doesn’t start from leftmost

where first_name=?

Skip columns in the index

where last_name=? and bod=?

Friday, December 30, 11

B+Tree: Limitations

More than one range conditions

where last_name>? and first_name>?

Can’t optimize to the right of the first range conditon

where last_name>? and first_name=?

Friday, December 30, 11

Clustered Index

Friday, December 30, 11

Clustered Index

Non Clustered

Clustered

Index organized table

Heap table

Friday, December 30, 11

Friday, December 30, 11

Useful Commands

Friday, December 30, 11

Useful commands

show index from TABLE;

explain [extended] SELECT * FROM TABLE;

UPDATE, DELETE convert to SELECT

Friday, December 30, 11

Explain

select_tpe

simple, primary, subquery, derived, union

type

all < index < range < ref < eq_ref < const, system < null

Friday, December 30, 11

Explain

Extra

using where

using index

using filesort

using temporary

Friday, December 30, 11

Indexing Strategies

Friday, December 30, 11

Indexing Strategies

Isolate the column

Prefix Indexes and Index Selectivity

Covering Indexes

Use Index Scan For Sorts

Friday, December 30, 11

Isolate the column

where last_name=”Fred”

where a+1=5

where md5(a)=”45c48cce2e2d7fbdea1afc5”

Friday, December 30, 11

Prefix index & Index selectivity

Prefix index

KEY index_on_sum(`sum`(5))

Index Selectivity

Cardinality/Count(*)

0..1

Friday, December 30, 11

Covering Index

select first_name from people where last_name=”fred”

Extra: Using index

Not support “Like” in query

Friday, December 30, 11

Using Index for Sorts

select * from people where last_name=? and first_name =? order by dob

Friday, December 30, 11

Redundant/Duplicate index

Duplicate

primary key(id)

key(id)

unique(id)

Redundant

key(a, b, c)

key(a, b)

key(a)

key(b, a)

Friday, December 30, 11

Others

Index merge

Or

Sub-query/Join/Union

Group/Order

Locking

Query optimization

Friday, December 30, 11

References

http://www.mysqlperformanceblog.com/

http://www.percona.com/

Friday, December 30, 11

Questions?

Friday, December 30, 11