索引是mysql中非常重要的一个知识点,掌握好索引的原理对系统的优化至关重要
索引是一种用于快速查询和检索数据的数据结构。mysql中的索引结构有: B+树和Hash。
索引的作用就相当于目录的作用。我们只需先去目录里查找字的位置,然后直接翻到那一页就行了。这样查找就会非常快
优点:
缺点:
innoDB存储引擎下的索引分类
回表查询 思考题: 已知name是二级索引,通过name查询的时候是怎么查询的?
答: 由于数据innodb底层是b+树实现的, 所以查询的时候 会通过二叉树的查找模式来进行查找. b+树的每个叶子节点都会存放数据, 而二级索引存放的是这行数据的id值, 所以拿到id后, 需要在查找一下聚集索引, 聚集索引的叶子节点存放的是这行数据的所有信息. 这个行为也称为回表查询
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`)
对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。
一种很普遍的数据库索引结构。其特点是定位高效、利用率高、自我平衡,理论上,使用Btree在亿条数据与100条数据中定位记录的花销相同。
首先要从mysql的存储说起: mysql的存储形式是页, 在没有使用索引时,
当添加索引后: 就是将无序的数据变成有序(相对),通过 “目录” 就可以很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))
如User表的name和city加联合索引就是(name,city),而最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。
select * from user where name=xx and city=xx ; //可以命中索引
select * from user where name=xx ; // 可以命中索引
select * from user where city=xx ; // 无法命中索引
例如组合索引(a,b,c),组合索引的生效原则是从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;
如下:
where a=3 and b=45 and c=5 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;
where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果
where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关
索引的知识点还是蛮多的,用好索引会让你的sql变得飞快