Mysql索引使用的数据结构主要有 BTree索引 和 Hash索引。对于Hash索引来讲,底层数据结构就是哈希表,所以在绝大多数需求为单条记录查询的时候,使用Hash索引查询性能最快。其他大多数场景建议使用BTree索引。html
MySQL的基本存储结构为 页 ,页与页之间使用双向链表进行连接,页内记录使用单向链表进行连接。查询数据时,先使用双向链表查询到数据所在的页,页内查询时,where子句中若是是主键则根据二分查找进行查询,若是为非主键则使用遍历链表的方式进行查询。整个时间复杂度为O(n)。面试
使用索引以后,能够利用BTree的数据结构进行查找数据,时间复杂度能够作到O(log n)。sql
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
复制代码
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
复制代码
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
复制代码
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
复制代码
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
复制代码
简单来说,创建联合索引时,当最左边的一个或多个索引肯定以后,紧跟着的索引才是有序的。(以下图,创建a,b的联合索引后,a的值为[1,1,2,2,3,3]有序,b的值为[1,2,1,4,1,2])当不肯定a的值时,b的值在结构上是无序的,这时仅where子查询中若是只使用b进行查找则会全表查找。 因此当咱们用
where a = 1 and b = 2
进行查询时,因为a肯定以后b的值有序,因此b字段查询时使用上索引。当咱们用where a > 1 and b = 2
进行查询时,a字段可使用索引,但b字段因为无序因此没法使用索引。数据库
简单归纳markdown
- 汇集索引就是以主键建立的索引
- 非汇集索引就是以非主键建立的索引
两者区别数据结构
where like '%索引'
没法使用索引Select * fromuser where phone=13800001234
select id,name from product limit 866613, 20
使用上述SQL语句作分页的时候,可能有人会发现,随着表数据量的增长,直接使用limit分页查询会愈来愈慢。优化的方法以下:能够取前一页的最大行数的id,而后根据这个最大的id来限制下一页的起点。好比此列中,上一页最大的id是866612。SQL能够采用以下的写法:select id,name from product where id> 866612 limit 20。
Q:请说说索引的注意事项,或者说说索引的优缺点。oop