Post on 11-May-2015
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