由于之前的每一个问题都是一个比较大的知识点,作者希望可以尽量一一详细解答,如果有不足的地方欢迎大家补充和修改,同时借鉴牛人写的Mysql中算法的实现以及内存原理,Btree结构等。
1:MySQL数据库存储引擎有MyISAM和innoDB,请问这两种类型的索引是如何存储的?
现在问问题已经不问MySQL有哪些存储引擎,也不问MyISAM与innoDB的区别了吗?直接开始问索引如何存储的吗?
这个还需要从MySQL为什么需要建立索引开始说起,索引能够提高数据检索的效率,降低数据库的IO成本和排序成本,在数据库中给字段添加索引,带来的最大好处就是该字段作为检索条件的时候能够大大提高我们检索的效率,加快检索时间,降低检索过程中需要扫描的数据量,但是我们不能一遇到query就给字段添加索引,索引并不是多多益善。
索引是把你设置为索引的字段A存储在独立区间S中,里面只有这个字段的内容,在查找这个字段与字段A的时候,只需要在区间S中去查找,而不是去数据库中查找,找到符合条件的字段,在去数据库中寻找与A对应的字段的物理地址,再把对应的数据读取出来。如果不添加索引,你查找的就有可能是整个数据库这里面会有大量的多余的字段查找,不相干的字段,数据库在判断不相干字段的过程中浪费了时间和效率。不是索引越多越好,你的每一个索引都是建立在一个单独区间S中的,独立区间越大搜索就会越占用你的资源。
详情请查看: http://blog.sina.com.cn/s/blog_8efa3c4f0102wqgs.html
ps:MyIsAm与innoDB区别:
一、InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
三、InnoDB支持外键,MyISAM不支持
四、MyISAM是默认引擎,InnoDB需要指定
五、InnoDB不支持FULLTEXT类型的索引
六、InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。
注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表
七、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
八、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
九、InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'
2:索引分为哪些?如何创建索引?索引如何优化?A,B,C联合索引如何才能命中索引?
MySQL索引分为主键索引,唯一索引,普通索引,全文索引以及复合索引等
创建主键索引:alter table ·user· add primary key('A');
创建唯一索引:alter table `user` add unique('A');
创建普通索引:alter table `user` add index index_name('A');
创建全文索引:alter table `user` add fulltext('A');
创建联合索引:alter table `user` add index index_name('A','B','C');
注意索引使用具有居左原则,也就是最先使用的索引必须排除掉最多选项,对于ABC联合索引,在使用的过程中只要具有A并且A排在第一位,即Ab,AC,ABC这样的索引使用即可命中索引,A为联合索引的引导列。
ps:
主键不一定自增,但是自增的键一定是主键。
使用explain命令查看sql,可以查看索引以及sql效率
索引的东西还有很多,合理使用索引需要开发者视具体业务而定。
全文索引在MySQL中是属于fulltext索引,并且只能在char,varchar或text类型的列上创建。
在MySQL5版本以上,varcahr(20)中的20代表的是20个字符,可以存储20个汉字,字母,数字等,存储汉字与字符编码没有关系。
varcahr(20),char(20)在超过规定字符之后都将无法插入到数据库。
SQL语句命令需要熟记于心。