使用索引的目的是把数据再次排序,提高查询速度,所以联合索引的顺序很重要,很大程度上决定查询速度

  • 提高数据库检索效率
  • 避免排序和临时表
  • 将随机I/O变为顺序I/O

1. 怎么建索引

alter table [tablename] add primary key (‘[keyname]’)

alert table [tablename] add index nidex_name (‘[keyname]’)

2. 建索引的基本原则

  • 列的唯一性太小不适合建索引(性别,类型等字段)同值得数据超过表的15%不适合建索引
  • 组合索引(使用索引的关键)
  • 一条sql语句执行只能用一个索引
  • 索引列不能出现null
  • where条件not in 、!= 、like %%、函数运算、or 不能使用索引
  • 三星索引原则
  • 索引将相关的记录放到一起称为一星
  • 如果索引中的顺序和查找的列顺序一样获得三星
  • 索引中的列包含所有要查找列获得三星

3. 自己的总结

  • B-树B+树(Mysql使用的是B+树)
  • 组合索引问题
  • 覆盖索引问题

B-树


从根节点开始查找,通过槽点中存放的指向子节点的指针。
这些指针实际上定义了子节点页面中值得上限>和下限

B+树

B-与B+的区别:B-树查找可以在非叶子结点结束。B+树只能到叶子结点。
B+树种所有的数据都在叶子节点中。

聚簇索引使用的是B+树本身的叶子结点存储的就是数据本身

B+树在每个叶子结点都增加了一个指向相邻叶子结点的指针。
这样的设计是为了提高区间查找的效率

非聚簇索引指的是叶子结点存放的是数据地址的指针
合适的列索引顺序

组合索引

最左原则:指的是创建的索引时的规则。
所有的索引的使用都是在where后面使用的跟字段顺序没有关系。
只要where 中出现组合索引最左边的字段 这个索引就已经在使用了。
例子索引 a、b、c where 中存在a就能用这个索引所以索引a、b、c 相当于 a。 a、b 。 a、b、c。

覆盖索引

前提是这条查询语句使用这个索引,换一种说法呢也就是我的where条件使用了这个索引。
但是不一定所有的条件都是索引列,可以有其他条件。
如果我的select中要查询的字段同样也是这个索引中的字段这样就是覆盖索引了。

实际问题

实际查询中经常用到性别这个字段怎么办?怎么建索引

答案是虽然按照索引创建规则性别这种唯一度很小的字段不应该建索引。
但是可以采用最左原则的小技巧把这个加入到索引中 where 使用 sex in (‘0’,’1’)

大量分页也可能导致查询效率低下
select from table1 where age>30 order by createtime limit 1000,10;
这种查询会花大量的时间扫描需要丢弃的数据。所以分成两部查询优化效率

1
2
3
4
5
select <cols> from profiles inner join
(select <primary key cols> from profiles
where x.sex = 'm' order by rating limit 10000,10)
as x using(<primary key cols>);