1、什么是事务?

事务是一系列的操作,他们要符合ACID特性。
最常见的理解就是:事务中的操作要么全部成功,要么全部失败,但是只是这样还不够的。

2、ACID是什么?

A=Atomicity
原子性,要么全部成功,要么全部失败,不可能只执行一部分操作。

C=Consistency
系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态。

I-Isolation
隔离性:通常来说,一个事务在完全提交之前,对其他事务是不可见的。(有例外情况)

D=Durability
持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果。

3、同时有多个事务在进行会怎么样呢?

多事务的并发进行一般会造成以下几个问题:
脏读:A事务读取到了B事务未提交的内容,而B事务后面进行了回滚。
不可重复读:当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不一样,因为在此期间B事务进行了提交操作。
幻读:A事务读取了一个范围的内容,而同时B事务在此期间插入了一条数据,造成“幻觉”。

4、怎么解决这些问题呢?MySQL的事务隔离级别了解吗?

MySQL的四种隔离级别如下:
1、未提交读
   这就是上面所说的例外情况,这个隔离级别下,其他事务可以看到本事务没有提交的部分修改。因此会造成脏读的问题(读取到 
   了其他事务未提交的部分,而之后该事务进行了回滚)。
这个级别的性能没有足够大的优势,但是又有很多的问题,因此很少使用。
2、已提交读
   其他事务只能读取到本事务已经提交的部分。这个隔离级别有不可重复读的问题,在同一个事务内的两次读取,拿到的结果竟 
   然不一样,因为另外一个事务对数据进行了修改。
3、可重复读
   可重复读隔离级别解决了上面不可重复读的问题,但是仍然有一个新问题,就是 幻读,当你读取 id>10 的数据行时,对涉及到 
   的所有行加上了读锁,此外另外一个事务新插入了一条 id=11 的数据,因为是新插入的,所以不会触发上面的锁的排斥,那么 
   进行本事务进行下一次的查询时会发现有一条 id=11 的数据,而上次的查询操作并没有获取到,再进行插入时会有主键冲突的 
   问题。
4、可串行化
   这是最高的隔离级别,可以解决上面提到的所有问题,因为他强制将所有的操作串行执行,这会导致并发性能急速下降,因此也 
   不是很常用。

5、InnoDB使用的是哪种隔离级别呢?

InnoDB默认使用的是可重复读隔离级别。

6、对MySQL的锁了解吗?

当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。

就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他人使用完毕才可以再次使用。

7、MySQL都有哪些锁呢?向上面那样子进行锁定岂不是有点阻碍并发效率了?

从锁的类别上来讲,有共享锁和排他锁。
共享锁:又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
排他锁:又

1、什么是索引?

索引是一种数据结构,可以帮助我们快速的进行数据的查找。

2、索引是个什么样的数据结构呢?

索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+索引等。
而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。

3、Hash索引和B+树索引有什么区别或者说优劣呢?

首先要知道Hash索引和B+树索引的底层实现原理:
Hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。
B+树底层实现是多路平衡查找树,对于每一次的查询都是从根结点出发,查找到叶子节点方可获得所查键值,然后根据查询判断是否需要回表查询数据。

那么可以看出他们有以下不同:
1、hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
   因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。
   而B+树的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。
2、hash索引不支持使用索引进行排序,原理同上。
3、hash索引不支持模糊查询以及多列索引的最左前缀匹配,原理也是因为hash函数的不可预测,AAAA和AAAB的索引没有相关性。
4、hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。
5、hash索引虽然在等值查询上较快,但是不稳定,性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能 
   极差,而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,其树的高度极低。

因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度,而不使用hash索引。

4、什么是聚簇索引?

在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引。
在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引,如果没有唯一键,则隐式的生成一个键来建立聚簇索引。
当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。

5、非聚簇索引一定会回表查询么?

不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。

举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行 select age from employee where age < 20 的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。

6、在建立索引的时候,都有哪些需要考虑的因素呢?

建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较合适。
如果需要建立联合索引的话,还需要考虑联合索引中的顺序。
此外,也要考虑其他方面,比如防止过多的所有对表造成太大的压力,这些都和实际的表结构以及查询方式有关。

7、联合索引是什么?为什么需要注意联合索引中的顺序?

MySQL可以使用多个字段同时建立一个索引,叫做联合索引。
在联合索引中,如果想要命中索引,需要按照建立索引的字段顺序挨个使用,否则无法命中索引。

具体原因为:
MySQL使用索引时需要索引有序,假设现在建立了 "name,age,school" 的联合索引,那么索引的排序为:先按照 name 排序,如果 name 相同,则按照 age 排序,如果 age 的值也相等,则按照 school 进行排序。
当进行查询时,此时索引仅仅按照 name 严格有序,因此必须首先使用 name 字段进行等值查询,之后对于匹配到的列而言,其按照 age字段 严格有序,此时可以使用 age 字段用作索引查找...以此类推,因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。

8、创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?

MySQl提供了 explain命令 来查看语句的执行计划,MySQL在执行某个语句之前,会将该语句过一遍查询优化器,之后会拿到对语句的分析,也就是执行计划,其中包含了许多信息,可以通过其中和索引有关的信息来分析是否命中了索引,例如 possible_key, key, key_len等字段,分别说明了此语句可能会使用的索引,实际使用的索引以及使用的索引长度。

9、那么在哪些情况下会发生针对该列创建了索引但是在查询的时候的时候并没有使用呢?

使用不等于查询
列参与了数学运算或者函数
在字符串 like 时左边是通配符,类似于 '%aaa'。
当mysql分析全表扫描比使用索引快的时候不使用索引。
当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引。

以上情况,MySQL无法使用索引。

1、从URL在浏览器被输入到页面展现的过程中发生了什么?
2、现代浏览器在与服务器建立了一个TCP连接后是否会在一个HTTP请求完成后断开?什么情况下会断开?
3、一个TCP连接可以对应几个HTTP请求?
4、

MYSQL mysql_real_connect(MYSQL mysql, const char host, const char user, const char passwd, const char db, unsigned int port, const char *unix_socket, unsigned long client_flag)

参数

第一个参数,MYSQL结构的地址。MYSQL *mysql mysql_init()后,会返回一个 指针。
第二个参数,主机名或者IP地址。如果是 NULL 和 localhost 则为本地主机的连接。
第三个参数,用户名
第四个参数,密码
第五个参数,数据库名称
第六个参数,端口号(如果“port”不是0,其值将用作TCP/IP连接的端口号。“host”参数决定了连接的类型。)
第七个参数,使用 socket 或者 管道机制
第八个参数,常常设置为0

返回值

如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。