认识索引

来源:互联网 发布:linux如何编辑文档 编辑:程序博客网 时间:2024/06/05 17:30
索引及使用方法
名词

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据表中的数据;
聚集索引,索引键值的逻辑顺序与索引所服务的表中相应的物理顺序相同的索引,反之为非聚集索引。


索引的作用
利用某查询会快很多(sql 语句中带where条件的都会用到索引);
update和delete 都可以用到索引;
update 通过调整索引可以让slave库的binlog很快跟上。
 
联合索引
对于联合索引(multiple-column),本着左边开先被用到,如(a,b,c)相当于(a),(a,b),(a,b,c);
假如有索引idx_abc(a,b,c)有如下查询;
select * from tb where a=xxx;能用到索引 索引里面直接能拿到数据 不回表;
select * from tb where b=xxx;不能用到索引;
除了(a)(a,b)(a,b,c)都不能用到索引。


加速join操作
需要注意join的列最好类型一致,size一样,字符型字符集要一样;
MySQL join 操作区分数据类型 ;
char(16) char(30) 在join的时候不能用到索引(size不一样的时候不能用到索引)。


排序
对于排序,min,max这类操作也可以加速。


传说中不回表
利用索引传输数据 不回表  在索引里面直接能拿到数据 索引包含的操作。


多列索引怎么选择
一个表里面的多列索引怎么选择比如:
select * from tb where c1=xxx and c2=xxx;
c1 varchar(10) c2 int(10) idx_c1(c1) idx_c2(c2); 
查询优化基于成本的优化 CBO MYSQL有统计视图 有大概的CBO模型 假设查询成本是1;
基于c1 string 优化成本0.9 基于c2 int 0.6 MySQL认为两个计划都是ok的 MYSQL就会按照先创建的顺序使用索引 原则会在5.7的时候会有变化 MYSQL基于trace的查询优化展示可以看出在每个步骤放的时间。


索引类型
按功能分

主键
唯一索引
普通索引(包含:联合索引)
前缀索引
全文索引


按存储结构分:
Btree索引
Hash索引
R-TREE索引


主键索引,唯一索引,普通索引的区别
主键和唯一索引 (主键不允许null 唯一允许null);
where col1=xxx; 主键和唯一查到条件立马返回 普通索引会比主键和唯一索引更多的开销;

innodb只允许有一个主键 唯一索引可以有多个的。


innodb表以主键为顺序排序存储,如果没有主键怎么办? 
如果没有主键,会选择第一个唯一索引,升级为主键做排序存储。
连唯一索引也没有?
隐含会创建一个6个字节长度的主键 如果没有主键成本会很高的。


索引创建的方法
普通索引
(= > <= between in)
create index idx_xxx on tb(xxx) or altertable tb add index idx_xxx(xxx)
前缀索引
alter table wb add index idx_c6(c6(3));
联合索引
create index idx_c3_c4 on wb(c3,c4)
联合索引是两个列结合的索引
前缀索引(减少空间节省io)
 
create index idx_email on tb(email(20));
update tb set c6=xxx where c3=xxx and c4=xxx
可以提用到索引工作很快的 
创建索引了不能update经常的更新 成本会很高的设计上避免更新索引列


全文索引(char varchar text)
create full index fdx_c5 on wb(c5)
使用方式
select match(列名)against(‘search_string’)as col from tb;
全文索引不要使用目前还不支持中文
 MySQL5.6 innodb增加了全文搜索(不支持中文)


唯一索引(=)
create unique idx_email on tb(’email’)
主键(=)
只能在定义,或是后期用alter table 操作
alter table TBName drop Primary key,add primary(col2);


Schema中如何选择合适的列作为索引
男女这种列,或是只2-3个不同值的列是否做索引
一个原则:选择基数比较大的列做索引,基数比较大,指该列值不相同的值很多,如:唯一索引列,每列值都不一样
选择基数比较大 重复值少的建索引
 
索引和锁的关系
常言innodb是行级锁,实际上只针对主键或是唯一索引的操作才是行级锁
innodb是行级别锁  基于唯一索引和主键等值操作才是行级别锁
 
识别表的重复索引,节省io(生产中的这种事情非常多)
update尽量不update索引的列




0 0
原创粉丝点击