1、
SQL的生命周期?1、 应用服务器与数据库服务器建立一个连接
2、 数据库进程拿到请求sql
3、 解析并生成执行计划,执行
4、 读取数据到内存并进行逻辑处理
5、 通过步骤一的连接,发送结果到客户端
6、 关掉连接,释放资源
2、
索引有哪几种类型?主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
1、 可以通过 ALTER TABLE table_name ADD UNIQUE (column);
创建唯一索引
2、 可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2);
创建唯一组合索引
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
1、 可以通过ALTER TABLE table_name ADD INDEX index_name (column);
创建普通索引
2、 可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);
创建组合索引
全文索引: 是目前搜索引擎使用的一种关键技术。
可以通过ALTER TABLE table_name ADD FULLTEXT (column);
创建全文索引
3、
前缀索引1、 语法:index(field(10))
,使用字段值的前10个字符建立索引,默认是使用字段的全部内容建立索引。
2、 前提:前缀的标识度高。比如密码就适合建立前缀索引,因为密码几乎各不相同。
3、 实操的难度:在于前缀截取的长度。
4、 我们可以利用select count(*)/count(distinct left(password,prefixLen));
,通过从调整prefixLen
的值(从1自增)查看不同前缀长度的一个平均匹配度,接近1时就可以了(表示一个密码的前prefixLen
个字符几乎能确定唯一一条记录)
4、
MyISAM表格将在哪里存储,并且还提供其存储格式?每个MyISAM表格以三种格式存储在磁盘上:
·“.frm”文件存储表定义
·数据文件具有“.MYD”(MYData)扩展名
索引文件具有“.MYI”(MYIndex)扩展名
5、
联合索引是什么?为什么需要注意联合索引中的顺序?MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。
具体原因为:
MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。
当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用做索引查找,以此类推。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。
6、
Myql中的事务回滚机制概述事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。
要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚
7、
MySQL中有哪几种锁,列举一下?如果按锁粒度划分,有以下3种:
1、 表锁: 开销小,加锁快;锁定力度大,发生锁冲突概率高,并发度最低;不会出现死锁。
2、 行锁: 开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。
3、 页锁: 开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
8、
limit 1000000 加载很慢的话,你是怎么解决的呢?**方案一:**如果id是连续的,可以这样,返回上次查询的最大记录(偏移量),再往下limit
select id,name from employee where id>1000000 limit 10.
**方案二:**在业务允许的情况下限制页数:
建议跟业务讨论,有没有必要查这么后的分页啦。因为绝大多数用户都不会往后翻太多页。
**方案三:**order by + 索引(id为索引)
select id,name from employee order by id limit 1000000,10
**方案四:**利用延迟关联或者子查询优化超多分页场景。(先快速定位需要获取的id段,然后再关联)
SELECT a.* FROM employee a, (select id from employee where 条件 LIMIT 1000000,10 ) b where a.id=b.id
9、
MySQL中int(20)和char(20)以及varchar(20)的区别1、 int(20) 表示字段是int类型,显示长度是 20
2、 char(20)表示字段是固定长度字符串,长度为 20
3、 varchar(20) 表示字段是可变长度字符串,长度为 20
10、
什么是内连接、外连接、交叉连接、笛卡尔积呢?1、 内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
2、 外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足匹配关系的记录。
3、 交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,也被称为:笛卡尔积。
11、
非聚簇索引一定会回表查询吗?不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。
举个简单的例子
假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20
的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。
12、
varchar(50)中50的涵义最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)。在早期 MySQL 版本中, 50 代表字节数,现在代表字符数。
13、
完整性约束包括哪些?数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。
分为以下四类:
1、 实体完整性:规定表的每一行在表中是惟一的实体。
2、 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。
3、 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
4、 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。
与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。
14、
谈谈六种关联查询,使用场景。1、 交叉连接
2、 内连接
3、 外连接
4、 联合查询
5、 全连接
6、 交叉连接
15、
MVCC熟悉吗,它的底层原理?MVCC,多版本并发控制,它是通过读取历史版本的数据,来降低并发事务冲突,从而提高并发性能的一种机制。
「MVCC需要关注这几个知识点:」
1、 事务版本号
2、 表的隐藏列
3、 undo log
4、 read view
16、
锁的优化策略1、 读写分离
2、 分段加锁
3、 减少锁持有的时间
4.多个线程尽量以相同的顺序去获取资源
不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。
17、
什么是聚簇索引?何时使用聚簇索引与非聚簇索引聚簇索引:
将数据存储与索引放到了一块,找到索引也就找到了数据
非聚簇索引:
将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因
澄清一个概念:
innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值
18、
500台db,在最快时间之内重启。2、 可以使用批量 ssh 工具 pssh 来对需要重启的机器执行重启命令。
3、 也可以使用 salt(前提是客户端有安装 salt)或者 ansible( ansible 只需要 ssh 免登通了就行)等多线程工具同时操作多台服务
19、
你们数据库是否支持emoji表情存储,如果不支持,如何操作?更换字符集utf8-->utf8mb4
20、
说一下大表查询的优化方案1、 优化shema、sql语句+索引;
2、 可以考虑加缓存,Memcached, Redis,或者JVM本地缓存;
3、 主从复制,读写分离;
4、 分库分表;
21、
按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。
MyISAM和InnoDB存储引擎使用的锁:
1、 MyISAM采用表级锁(table-level locking)。
2、 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
行级锁,表级锁和页级锁对比
行级锁
行级锁是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
特点:
开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
表级锁
表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)
特点:
开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
页级锁
页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
特点:
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
22、
数据库索引的原理,为什么要用 B+树,为什么不用二叉树?可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?
为什么不是一般二叉树?
如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。
为什么不是平衡二叉树呢?
我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。
那为什么不是B树而是B+树呢?
1)B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。
2)B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
23、
MYSQL数据库服务器性能分析的方法命令有哪些?Show status, 一些值得监控的变量值:
1、 Bytes_received和Bytes_sent 和服务器之间来往的流量。
2、 Com_*服务器正在执行的命令。
3、 Created_*在查询执行期限间创建的临时表和文件。
4、 Handler_*存储引擎操作。
5、 Select_*不同类型的联接执行计划。
6、 Sort_*几种排序信息。
Show profiles 是MySql用来分析当前会话SQL语句执行的资源消耗情况
24、
SQL语句的语法顺序?1、 SELECT
2、 FROM
3、 JOIN
4、 ON
5、 WHERE
6、 GROUP BY
7、 HAVING
8、 UNION
9、 ORDER BY
10、 LIMIT
25、
简述在MySQL数据库中MyISAM和InnoDB的区别MyISAM:
不支持事务,但是每次查询都是原子的;
支持表级锁,即每次操作是对整个表加锁;
存储表的总行数;
一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。
InnoDb:
支持ACID的事务,支持事务的四种隔离级别;
支持行级锁及外键约束:因此可以支持写并发;
不存储总行数;
一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制;
主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
26、
一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。1、 如果A表TID是自增长,并且是连续的,B表的ID为索引 select * from a,b where a.tid = b.id and a.tid>500000 limit 200;
2、 如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。 select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;
27、
MySQL的复制原理以及流程「主从复制原理,简言之,就三步曲,如下:」
1、 主数据库有个bin-log二进制文件,纪录了所有增删改Sql语句。(binlog线程)
2、 从数据库把主数据库的bin-log文件的sql语句复制过来。(io线程)
3、 从数据库的relay-log重做日志文件中再执行一次这些sql语句。(Sql执行线程)
上图主从复制分了五个步骤进行:
步骤一:主库的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库。
步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库。
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
28、
读写分离常见方案?1、 应用程序根据业务逻辑来判断,增删改等写操作命令发给主库,查询命令发给备库。
2、 利用中间件来做代理,负责对数据库的请求识别出读还是写,并分发到不同的数据库中。(如:amoeba,MySQL-proxy)
29、
drop、delete与truncate的区别delete | truncate | drop | |
---|---|---|---|
类型 | DML | DDL | DDL |
回滚 | 可回滚 | 不可回滚 | 不可回滚 |
删除内容 | 表结构还在,删除表的全部或者一部分数据行 | 表结构还在,删除表中的所有数据 | 从数据库中删除表,所有的数据行,索引和权限也会被删除 |
删除速度 | 删除速度慢,逐行删除 | 删除速度快 | 删除速度最快 |
30、
字段为什么要求定义为not null?null值会占用更多的字节,并且null有很多坑的。
31、
MySQL中有哪几种锁?1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3\、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
32、
myisamchk是用来做什么的?它用来压缩MyISAM表,这减少了磁盘或内存使用。
33、
NULL是什么意思NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。
使用IS NULL来进行NULL判断
34、
读写分离有哪些解决方案?读写分离是依赖于主从复制,而主从复制又是为读写分离服务的。因为主从复制要求slave
不能写只能读(如果对slave
执行写操作,那么show slave status
将会呈现Slave_SQL_Running=NO
,此时你需要按照前面提到的手动同步一下slave
)。
方案一
使用MySQL-proxy代理
优点:
直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号,MySQL官方不建议实际生产中使用
缺点:
降低性能, 不支持事务
方案二
1、 使用AbstractRoutingDataSource+aop+annotation在dao层决定数据源。
2、 如果采用了mybatis, 可以将读写分离放在ORM层,比如mybatis可以通过mybatis plugin拦截sql语句,所有的insert/update/delete都访问master库,所有的select 都访问salve库,这样对于dao层都是透明。 plugin实现时可以通过注解或者分析语句是读写方法来选定主从库。不过这样依然有一个问题, 也就是不支持事务, 所以我们还需要重写一下DataSourceTransactionManager, 将read-only的事务扔进读库, 其余的有读有写的扔进写库。
方案三
1、 使用AbstractRoutingDataSource+aop+annotation在service层决定数据源,可以支持事务.
2、 缺点:类内部方法通过this.xx()方式相互调用时,aop不会进行拦截,需进行特殊处理。
35、
数据库为什么使用B+树而不是B树1、 B树只适合随机检索,而B+树同时支持随机检索和顺序检索;
2、 B+树空间利用率更高,可减少I/O次数,磁盘读写代价更低。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗。B+树的内部结点并没有指向关键字具体信息的指针,只是作为索引使用,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素;
3、 B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。而在B+树中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。
4、 B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。
5、 增删文件(节点)时,效率更高。因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。
36、
Innodb的事务实现原理?1、 原子性:是使用 undo log来实现的,如果事务执行过程中出错或者用户执行了rollback,系统通过undo log日志返回事务开始的状态。
2、 持久性:使用 redo log来实现,只要redo log日志持久化了,当系统崩溃,即可通过redo log把数据恢复。
3、 隔离性:通过锁以及MVCC,使事务相互隔离开。
4、 一致性:通过回滚、恢复,以及并发情况下的隔离性,从而实现一致性。
37、
一条SQL语句在MySQL中如何执行的?查询语句:
1、 先检查该语句是否有权限
2、 如果没有权限,直接返回错误信息
3、 如果有权限,在 MySQL8.0 版本以前,会先查询缓存。
4、 如果没有缓存,分析器进行词法分析,提取 sql 语句select等的关键元素。然后判断sql 语句是否有语法错误,比如关键词是否正确等等。
5、 优化器进行确定执行方案
6、 进行权限校验,如果没有权限就直接返回错误信息,如果有权限就会调用数据库引擎接口,返回执行结果。
38、
什么是死锁?怎么解决?死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
常见的解决死锁的方法
1、 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
如果业务不好处理,可以用分布式事务锁或者使用乐观锁
39、
如何在Unix和MySQL时间戳之间进行转换?UNIX_TIMESTAMP是从MySQL时间戳转换为Unix时间戳的命令
FROM_UNIXTIME是从Unix时间戳转换为MySQL时间戳的命令
40、
UNION与UNION ALL的区别?1、 Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
2、 Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
3、 UNION的效率高于 UNION ALL
41、
CHAR和VARCHAR的区别?1.CHAR和VARCHAR类型在存储和检索方面有所不同
2.CHAR列长度固定为创建表时声明的长度,长度值范围是1到255
当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
42、
Hash索引和B+树所有有什么区别或者说优劣呢?1、 首先要知道Hash索引和B+树索引的底层实现原理:
2、 hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。
那么可以看出他们有以下的不同:
1、 hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
2、 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。
3、 hash索引不支持使用索引进行排序,原理同上。
4、 hash索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为hash函数的不可预测。AAAA和AAAAB的索引没有相关性。
5、 hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。
6、 hash索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。
7、 因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度。而不需要使用hash索引。
43、
索引的基本原理索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
索引的原理很简单,就是把无序的数据变成有序的查询
1、 把创建了索引的列的内容进行排序
2、 对排序结果生成倒排表
3、 在倒排表内容上拼上数据地址链
4、 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
44、
LIKE声明中的%和_是什么意思?%对应于0个或更多字符,_只是LIKE语句中的一个字符。
45、
SQL 约束有哪几种呢?1、 NOT NULL: 约束字段的内容一定不能为NULL。
2、 UNIQUE: 约束字段唯一性,一个表允许有多个 Unique 约束。
3、 PRIMARY KEY: 约束字段唯一,不可重复,一个表只允许存在一个。
4、 FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键。
5、 CHECK: 用于控制字段的值范围。
46、
创建索引的三种方式在执行CREATE TABLE时创建索引
CREATE TABLE `employee` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`date` datetime DEFAULT NULL,
`sex` int(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
使用ALTER TABLE命令添加索引
ALTER TABLE table_name ADD INDEX index_name (column);
使用CREATE INDEX命令创建
CREATE INDEX index_name ON table_name (column);
47、
为什么官方建议使用自增长主键作为索引?结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。
48、
主从同步延迟的原因一个服务器开放N个链接给客户端来连接的,这样有会有大并发的更新操作, 但是从服务器的里面读取binlog的线程仅有一个,当某个SQL在从服务器上执行的时间稍长 或者由于某个SQL要进行锁表就会导致,主服务器的SQL大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。
49、
数据库中的事务是什么?事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
事务特性:
1、 原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
2、 一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
3、 隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
4、 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
或者这样理解:
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
50、
索引的一些潜规则1、 覆盖索引
2、 回表
3、 索引数据结构(B+树)
4、 最左前缀原则
5、 索引下推
内容来源于网络,如有侵权,请联系作者删除!
1、
SQL的生命周期?2、
索引有哪几种类型?3、
前缀索引4、
MyISAM表格将在哪里存储,并且还提供其存储格式?5、
联合索引是什么?为什么需要注意联合索引中的顺序?6、
Myql中的事务回滚机制概述7、
MySQL中有哪几种锁,列举一下?8、
limit 1000000 加载很慢的话,你是怎么解决的呢?9、
MySQL中int(20)和char(20)以及varchar(20)的区别10、
什么是内连接、外连接、交叉连接、笛卡尔积呢?11、
非聚簇索引一定会回表查询吗?12、
varchar(50)中50的涵义13、
完整性约束包括哪些?14、
谈谈六种关联查询,使用场景。15、
MVCC熟悉吗,它的底层原理?16、
锁的优化策略17、
什么是聚簇索引?何时使用聚簇索引与非聚簇索引18、
500台db,在最快时间之内重启。19、
你们数据库是否支持emoji表情存储,如果不支持,如何操作?20、
说一下大表查询的优化方案21、
按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法22、
数据库索引的原理,为什么要用 B+树,为什么不用二叉树?23、
MYSQL数据库服务器性能分析的方法命令有哪些?24、
SQL语句的语法顺序?25、
简述在MySQL数据库中MyISAM和InnoDB的区别26、
一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。27、
MySQL的复制原理以及流程28、
读写分离常见方案?29、
drop、delete与truncate的区别30、
字段为什么要求定义为not null?31、
MySQL中有哪几种锁?32、
myisamchk是用来做什么的?33、
NULL是什么意思34、
读写分离有哪些解决方案?35、
数据库为什么使用B+树而不是B树36、
Innodb的事务实现原理?37、
一条SQL语句在MySQL中如何执行的?38、
什么是死锁?怎么解决?39、
如何在Unix和MySQL时间戳之间进行转换?40、
UNION与UNION ALL的区别?41、
CHAR和VARCHAR的区别?42、
Hash索引和B+树所有有什么区别或者说优劣呢?43、
索引的基本原理44、
LIKE声明中的%和_是什么意思?45、
SQL 约束有哪几种呢?46、
创建索引的三种方式47、
为什么官方建议使用自增长主键作为索引?48、
主从同步延迟的原因49、
数据库中的事务是什么?50、
索引的一些潜规则