多数数据库,使用 B 树(Balance Tree)的结构来保存索引。
B 树,
最上层节点:根节点
最下层节点:叶子节点
两者之间的节点:中间节点
B 树,显著特征:从根节点,到各个叶子节点的距离都是相等的。如此,检索任何值时,都经过相同数目的节点。
CREATE INDEX idx_lname_pinyin ON employee(lname_pinyin);
SHOW INDEX FROM employee\G
DROP INDEX idx_lname_pinyin ON employee;
复合索引
CREATE INDEX idx_pinyin ON employee( lname_pinyin, fname_pinyin);
SHOW INDEX FROM employee\G
唯一性索引
使用 UNIQUE 关键字,来创建不可重复的索引,称为:唯一性索引。
对特定列创建唯一性索引,相当于对该列追加了唯一性制约。
创建唯一性索引的时候,如果对象列中,已经含有重复数据,则:创建失败,报错。
创建成功后,如果,插入重复数据,则:插入失败,报错。
指定多个列,来创建唯一性索引,只要,这些列的组合数据不重复,就可以创建成功。
CREATE UNIQUE INDEX idx_fname ON employee(fname);
CREATE UNIQUE INDEX idx_lname ON employee(lname);
CREATE UNIQUE INDEX idx_fullname ON employee(lname, fname);
EXPLAIN SELECT * FROM employee WHERE lname_pinyin='wang'\G
CREATE INDEX idx_lname_pinyin ON employee(lname_pinyin);
EXPLAIN SELECT * FROM employee WHERE lname_pinyin='wang'\G
EXPLAIN 命令的说明:P100 表格
SELECT * FROM employee WHERE lname_pinyin LIKE '%w%';
SELECT * FROM employee WHERE lname_pinyin LIKE '%w';
SELECT * FROM employee WHERE lname_pinyin IS NOT NULL;
SELECT * FROM employee WHERE lname_pinyin <> 'wang';
SELECT * FROM employee WHERE YEAR(birth) = '1980'; -- 不使用索引
SELECT * FROM employee WHERE birth >= '1980-01-01' AND birth <= '1980-12-31'; --使用了索引
CREATE INDEX idx_pinyin ON employee(lname_pinyin, fname_pinyin);
SELECT * FROM employee WHERE lname_pinyin = 'wang' AND fname_pinyin = 'xiao'; --用了索引
SELECT * FROM employee WHERE lname_pinyin = 'wang'; --用了索引
SELECT * FROM employee WHERE fname_pinyin = 'xiao'; -- 没有使用索引
SELECT * FROM employee WHERE lname_pinyin = 'wang' OR fname_pinyin = 'xiao'; -- 没有使用索引