由于之前的每一个问题都是一个比较大的知识点,作者希望可以尽量一一详细解答,如果有不足的地方欢迎大家补充和修改,同时借鉴牛人写的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语句命令需要熟记于心。

PHP面试题分享与答案的更多相关文章

  1. 挑战10个最难的Java面试题(附答案)【下】【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  2. 挑战10个最难的Java面试题(附答案)【上】【华为云技术分享】

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/devcloud/article/deta ...

  3. 40道Java基础常见面试题及详细答案

    最近看到网上流传着各种面试经验及面试题,往往都是一大堆技术题目贴上去,但是没有答案. 为此我业余时间整理了40道Java基础常见的面试题及详细答案,望各路大牛发现不对的地方不吝赐教,留言即可. 八种基 ...

  4. iOS面试题整理带答案

    iOS面试题整理带答案       找工作,面试是避免不了的! 而技术开发面试,问一些技术相关的问题是必须的,最新的技术可能人人都趋之若鹜,但有些原理和基础的也希望都有了解. 这里整理了一些iOS相关 ...

  5. J2EE面试题集锦(附答案)

    转自:http://blog.sina.com.cn/s/blog_4e8be0590100fbb8.html J2EE面试题集锦(附答案)一.基础问答 1.下面哪些类可以被继承? java.lang ...

  6. Android 面试题集 包含答案

    作者:guoxiaoxing 链接: https://github.com/guoxiaoxing/android-interview 本文基于作者采用的MIT协议分发. 手画一下Android系统架 ...

  7. java_面试_02_Java面试题库及答案解析

    二.参考资料 1.Java面试题库及答案解析

  8. C语言试题(标准答案)

    C语言试题(标准答案) 一.单选题(每小题2分,共20小题40分) 1.1-1.5    B D A C B                1.6-1.10    C A D B C 1.11-1.1 ...

  9. C语言编程规范试题(标准答案)

    C语言编程规范试题(标准答案) 一.单选题(每小题3分,共20小题60分) 1.1-1.5    B D A C B                1.6-1.10    C A D B C 1.11 ...

随机推荐

  1. 树莓派开启wlan功能

    烧好系统之后,通过网线连接树莓派到路由器.通过ip登入系统,修改interfaces文件,添加下面内容 sudo nano /etc/network/interfacesauto wlan0allow ...

  2. apply、call、bind区别、用法

    apply和call都是为了改变某个函数运行时的上下文而存在的(就是为了改变函数内部this的指向):   如果使用apply或call方法,那么this指向他们的第一个参数,apply的第二个参数是 ...

  3. tabs(标签页的现成页面)原生js写法

    直接上代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  4. 【linux相识相知】VIM编辑器

    Vim是一个类似Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了许多的功能,VIM是自由软件,今天我们就来讲讲VIM的使用方法. 本文是基于centos7上的vim编辑器演示的 ...

  5. bzoj 5305: [Haoi2018]苹果树

    Description Solution \(n\) 个点的二叉树的方案数是 \(n!\) 证明十分显然:新加入的点占掉了 \(1\) 个位置,新加了 \(2\) 个位置,那么多出来一个位置,所以第 ...

  6. 两个三汇API使用的坑

    最近呼叫中心走火入魔了,我的<一步一步开发呼叫中心>系列编写过程中,遇到各种的问题,今天晚上,来记录一下纠结了我N久的一个问题: 内线通过板卡外呼时,如果对方的呼叫中心需要发送按键响应(如 ...

  7. javascript对象(3)

    这个对象,不是那个对象,第三哦! 对象之间会存在继承,所以,来说一下他们之间存在的三种三种继承方式: 1.冒用继承 //创建了孙悟空构造函数 function Sun(change,weapon,gf ...

  8. 前端自动化构建工具Grunt

    一.了解Gurnt(http://www.open-open.com/lib/view/open1433898272036.html) Grunt 是一个基于任务的JavaScript工程命令行构建工 ...

  9. linux里终端安转视频播放器的操作及显示

    [enilu@enilu ~]$ mplayerbash: mplayer: command not found[enilu@enilu ~]$ yum list | grep mplayer^C^C ...

  10. java 理解有符号数和无符号数

    转至:http://jinguo.iteye.com/blog/212049 理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答. 一种是教科书,它会告诉你:计算机用“ ...