该文已加入开源文档:JavaGuide(一份涵盖大部分Java程序员所须要掌握的核心知识)。地址: https://github.com/Snailclimb...
系列思惟导图源文件(数据库+架构)以及思惟导图制做软件—XMind8 破解安装,公众号后台回复: “思惟导图” 免费领取!(下面的图片不是很清楚,原图很是清晰,另外提供给你们源文件也是为了你们根据本身须要进行修改)
下面是我补充的一些内容
如下内容整理自:
地址: https://juejin.im/post/5b55b8...
做者 :Java3y
MySQL的基本存储结构是页(记录都存在页里边):git
每一个数据页中的记录又能够组成一个单向链表程序员
- 每一个数据页都会为存储在它里边儿的记录生成一个页目录,在经过主键查找某条记录的时候能够在页目录中使用二分法快速定位到对应的槽,而后再遍历该槽对应分组中的记录便可快速找到指定的记录 - 以其余列(非主键)做为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。
因此说,若是咱们写select * from user where indexname = 'xxx'这样没有进行任何优化的sql语句,默认会这样作:github
很明显,在数据量很大的状况下这样查找会很慢!这样的时间复杂度为O(n)。面试
索引作了些什么可让咱们查询加快速度呢?其实就是将无序的数据变成有序(相对):sql
要找到id为8的记录简要步骤:数据库
很明显的是:没有用索引咱们是须要遍历双向链表来定位对应的页,如今经过 “目录” 就能够很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))微信
其实底层结构就是B+树,B+树做为树的一种实现,可以让咱们很快地查找出对应的记录。架构
如下内容整理自:《Java工程师修炼之道》
MySQL中的索引能够以必定顺序引用多列,这种索引叫做联合索引。如User表的name和city加联合索引就是(name,city)o而最左前缀原则指的是,若是查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就能够被用到。以下:ide
select * from user where name=xx and city=xx ; //能够命中索引 select * from user where name=xx ; // 能够命中索引 select * from user where city=xx; // 法命中索引
这里须要注意的是,查询的时候若是两个条件都用上了,可是顺序不一样,如 city= xx and name =xx
,那么如今的查询引擎会自动优化为匹配联合索引的顺序,这样是可以命中索引的.post
因为最左前缀原则,在建立联合索引时,索引字段的顺序须要考虑字段值去重以后的个数,较多的放前面。ORDERBY子句也遵循此规则。
冗余索引指的是索引的功能相同,可以命中 就确定能命中 ,那么 就是冗余索引如(name,city )和(name )这两个索引就是冗余索引,可以命中后者的查询确定是可以命中前者的 在大多数状况下,都应该尽可能扩展已有的索引而不是建立新索引。
MySQLS.7 版本后,能够经过查询 sys 库的 schemal_r dundant_indexes
表来查看冗余索引
1.添加PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(惟一索引)
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
你若怒放,清风自来。 欢迎关注个人微信公众号:“Java面试通关手册”,一个有温度的微信公众号。公众号后台回复关键字“1”,你可能看到想要的东西哦!