如下内容整理自: 地址: juejin.im/post/5b55b8… 做者 :Java3ysql
MySQL的基本存储结构是页(记录都存在页里边):bash
因此说,若是咱们写select * from user where indexname = 'xxx'这样没有进行任何优化的sql语句,默认会这样作:post
很明显,在数据量很大的状况下这样查找会很慢!这样的时间复杂度为O(n)。性能
索引作了些什么可让咱们查询加快速度呢?其实就是将无序的数据变成有序(相对):优化
要找到id为8的记录简要步骤:ui
很明显的是:没有用索引咱们是须要遍历双向链表来定位对应的页,如今经过 “目录” 就能够很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))spa
其实底层结构就是B+树,B+树做为树的一种实现,可以让咱们很快地查找出对应的记录。3d
如下内容整理自:《Java工程师修炼之道》code
MySQL中的索引能够以必定顺序引用多列,这种索引叫做联合索引。如User表的name和city加联合索引就是(name,city),而最左前缀原则指的是,若是查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就能够被用到。以下:orm
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
,那么如今的查询引擎会自动优化为匹配联合索引的顺序,这样是可以命中索引的.
因为最左前缀原则,在建立联合索引时,索引字段的顺序须要考虑字段值去重以后的个数,较多的放前面。ORDERBY子句也遵循此规则。
冗余索引指的是索引的功能相同,可以命中 就确定能命中 ,那么 就是冗余索引如(name,city )和(name )这两个索引就是冗余索引,可以命中后者的查询确定是可以命中前者的 在大多数状况下,都应该尽可能扩展已有的索引而不是建立新索引。
MySQLS.7 版本后,能够经过查询 sys 库的 schema_redundant_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` )
复制代码