1. mysql 中 myisam 与 innodb 的区别

    1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
    2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
    3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。也就是说:InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
    4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件);
    5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了
    6. MyISAM表格可以被压缩后进行查询操作
    7. InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
    8. InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有
    9. Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYIInnodb:frm是表定义文件,ibd是数据文件Myisam:frm是表定义文件,myd是数据文件,myi是索引文件
    
  2. MySQL存储引擎选型及注意事项

    1、InnoDB存储引擎
    InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
    2、MyISAM存储引擎
    MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
    3、Archive引擎
    Archive存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。
    Archive表适合日志和数据采集类应用。
    4、Blackhole引擎
    Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。但服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多问题,因此并不推荐。
    5、CSV引擎
    CSV引擎可以将普通的SCV文件作为MySQL的表来处理,但不支持索引。
    CSV引擎可以作为一种数据交换的机制,非常有用。
    6、Federated引擎
    Federated引擎是访问其他MySQL服务器的一个代理,尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁用的。
    7、Memory引擎
    如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么使用Memory表是非常有用。Memory表至少比MyISAM表要快一个数量级。
    8、NDB集群引擎
    MySQL服务器、NDB集群存储引擎,以及分布式的、share-nothing的、容灾的、高可用的NDB数据库的组合,被称为MySQL集群(MySQL Cluster)。
    
  3. 解读MySQL的共享锁 & 排他锁 & 意向锁

    1 共享锁(Share Lock)共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。用法SELECT … LOCK IN SHARE MODE;在查询语句后面增加LOCK IN SHARE MODE,MySQL 就会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。2 排他锁(Exclusive Lock)排他锁又称写锁、独占锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。用法SELECT … FOR UPDATE;在查询语句后面增加FOR UPDATE,MySQL 就会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。3 意向锁(Intention Lock)意向锁是表级锁,其设计目的主要是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB 中的两个表锁:意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁;意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。意向锁是 InnoDB 自动加的,不需要用户干预。对于INSERT、UPDATE和DELETE,InnoDB 会自动给涉及的数据加排他锁;对于一般的SELECT语句,InnoDB 不会加任何锁,事务可以通过以下语句显式加共享锁或排他锁。共享锁:SELECT … LOCK IN SHARE MODE;排他锁:SELECT … FOR UPDATE;
    
  4. MySQL事务及隔离界别

    脏读(Dirty Read):脏读是读到了别的事务du回滚前的脏数据。比如事务B执行过程中修改了数zhi据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。不可重复读(Nonerepeatable Read):事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但列内容发生了变化;幻读(Phantom Read):事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到两行记录row1和row2;Ps:事务B未提交就是脏读,已提交,数据变化了就是不可重复读,条数变化了就是幻读。可以这么记防止混淆;
    1. 读取未提交(Read Uncommitted)有脏读
    2. 读取已提交(Read Committed)有不可重复读
    3. 可重复读(Repeatable Read)有幻读,不过有MVCC(拷贝镜像)和gap锁(间隙锁)解决
    4. 可串行化(Serializable)
  5. 正确掌握使用执行计划
    参考链接

    当Explain 与 SQL语句一起使用时,MySQL 会显示来自优化器关于SQL执行的信息。也就是说,MySQL解释了它将如何处理该语句,包括如何连接表以及什么顺序连接表等。1. 表的加载顺序
    2. sql 的查询类型
    3. 可能用到哪些索引,哪些索引又被实际使用
    4. 表与表之间的引用关系
    5. 一个表中有多少行被优化器查询 .....
    Explain 执行计划包含字段信息如下:分别是 id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra 12个字段。一、id
    id: :表示查询中执行select子句或者操作表的顺序,id的值越大,代表优先级越高,越先执行。 id大致会出现 3种情况:
    1、id相同
    看到三条记录的id都相同,可以理解成这三个表为一组,具有同样的优先级,执行顺序由上而下,具体顺序由优化器决定。
    2、id不同
    如果我们的 SQL 中存在子查询,那么 id的序号会递增,id值越大优先级越高,越先被执行 。当三个表依次嵌套,发现最里层的子查询 id最大,最先执行。
    3、以上两种同时存在
    将上边的 SQL 稍微修改一下,增加一个子查询,发现 id的以上两种同时存在。相同id划分为一组,这样就有三个组,同组的从上往下顺序执行,不同组 id值越大,优先级越高,越先执行。二、select_type
    select_type:表示 select 查询的类型,主要是用于区分各种复杂的查询,例如:普通查询、联合查询、子查询等。1、SIMPLE
    SIMPLE:表示最简单的 select 查询语句,也就是在查询中不包含子查询或者 union交并差集等操作。2、PRIMARY
    PRIMARY:当查询语句中包含任何复杂的子部分,最外层查询则被标记为PRIMARY。3、SUBQUERY
    SUBQUERY:当 select 或 where 列表中包含了子查询,该子查询被标记为:SUBQUERY 。4、DERIVED
    DERIVED:表示包含在from子句中的子查询的select,在我们的 from 列表中包含的子查询会被标记为derived 。5、UNION
    UNION:如果union后边又出现的select 语句,则会被标记为union;若 union 包含在 from 子句的子查询中,外层 select 将被标记为 derived。6、UNION RESULT
    UNION RESULT:代表从union的临时表中读取数据,而table列的<union1,4>表示用第一个和第四个select的结果进行union操作三、table
    查询的表名,并不一定是真实存在的表,有别名显示别名,也可能为临时表,例如上边的DERIVED、 <union1,4>等四、partitions
    查询时匹配到的分区信息,对于非分区表值为NULL,当查询的是分区表时,partitions显示分区表命中的分区情况。五、type
    type:查询使用了何种类型,它在 SQL优化中是一个非常重要的指标,以下性能从好到坏依次是:system  > const > eq_ref > ref  > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL1、systemsystem: 当表仅有一行记录时(系统表),数据量很少,往往不需要进行磁盘IO,速度非常快。2、constconst:表示查询时命中 primary key 主键或者 unique 唯一索引,或者被连接的部分是一个常量(const)值。这类扫描效率极高,返回数据量少,速度非常快。3、eq_refeq_ref:查询时命中主键primary key 或者 unique key索引, type 就是 eq_ref。4、refref:区别于eq_ref ,ref表示使用非唯一性索引,会找到很多个符合条件的行。5、ref_or_nullref_or_null:这种连接类型类似于 ref,区别在于 MySQL会额外搜索包含NULL值的行。6、index_mergeindex_merge:使用了索引合并优化方法,查询使用了两个以上的索引下边示例中同时使用到主键one_id 和 字段one_name的idx_name 索引 。7、unique_subqueryunique_subquery:替换下面的 IN子查询,子查询返回不重复的集合。8、index_subqueryindex_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值。9、rangerange:使用索引选择行,仅检索给定范围内的行。简单点说就是针对一个有索引的字段,给定范围检索数据。在where语句中使用 bettween...and、<、>、<=、in 等条件查询 type 都是 range。举个栗子:three表中three_id为唯一主键,user_id普通字段未建索引。mysql> EXPLAIN SELECT * from three where three_id BETWEEN 2 AND 3;+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+|  1 | SIMPLE      | three | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    1 |      100 | Using where |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+从结果中看到只有对设置了索引的字段,做范围检索 type 才是 range。mysql> EXPLAIN SELECT * from three where user_id BETWEEN 2 AND 3;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+|  1 | SIMPLE      | three | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------10、indexindex:Index 与ALL 其实都是读全表,区别在于index是遍历索引树读取,而ALL是从硬盘中读取。下边示例:three_id 为主键,不带 where 条件全表查询 ,type结果为index mysql> EXPLAIN SELECT three_id from three ;+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+|  1 | SIMPLE      | three | NULL       | index | NULL          | PRIMARY | 4       | NULL |    1 |      100 | Using index |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+11、ALLALL:将遍历全表以找到匹配的行,性能最差mysql> EXPLAIN SELECT * from two ;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+|  1 | SIMPLE      | two   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |      100 | NULL  |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+六、possible_keys
    possible_keys:表示在MySQL中通过哪些索引,能让我们在表中找到想要的记录,一旦查询涉及到的某个字段上存在索引,则索引将被列出,但这个索引并不定一会是最终查询数据时所被用到的索引。具体请参考上边的例子。七、key
    key:区别于possible_keys,key是查询中实际使用到的索引,若没有使用索引,显示为NULL。具体请参考上边的例子。八、key_len
    key_len:表示查询用到的索引长度(字节数),原则上长度越短越好 。
    1. 单列索引,那么需要将整个索引长度算进去;
    2. 多列索引,不是所有列都能用到,需要计算查询中实际用到的列。九、ref
    ref:常见的有:const,func,null,字段名。
    - 当使用常量等值查询,显示const,
    - 当关联查询时,会显示相应关联表的关联字段
    - 如果查询条件使用了表达式、函数,或者条件列发生内部隐式转换,可能显示为func
    - 其他情况null
    十、rows
    rows:以表的统计信息和索引使用情况,估算要找到我们所需的记录,需要读取的行数。
    这是评估SQL 性能的一个比较重要的数据,mysql需要扫描的行数,很直观的显示 SQL 性能的好坏,一般情况下 rows 值越小越好。
    十一、filtered
    filtered 这个是一个百分比的值,表里符合条件的记录数的百分比。简单点说,这个字段表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例。在MySQL.5.7版本以前想要显示filtered需要使用explain extended命令。MySQL.5.7后,默认explain直接显示partitions和filtered的信息。十二、Extra
    Extra :不适合在其他列中显示的信息,Explain 中的很多额外的信息会在 Extra 字段显示。
    1、Using index
    Using index:我们在相应的 select 操作中使用了覆盖索引,通俗一点讲就是查询的列被索引覆盖,使用到覆盖索引查询速度会非常快,SQl优化中理想的状态。什么又是覆盖索引?一条 SQL只需要通过索引就可以返回,我们所需要查询的数据(一个或几个字段),而不必通过二级索引,查到主键之后再通过主键查询整行数据(select * )。one_id表为主键
    2、Using where
    Using where:查询时未找到可用的索引,进而通过where条件过滤获取所需数据,但要注意的是并不是所有带where语句的查询都会显示Using where。
    下边示例create_time 并未用到索引,type 为 ALL,即MySQL通过全表扫描后再按where条件筛选数据。
    3、Using temporary
    Using temporary:表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。
    4、Using filesort
    Using filesort:表示无法利用索引完成的排序操作,也就是ORDER BY的字段没有索引,通常这样的SQL都是需要优化的。
    如果ORDER BY字段有索引就会用到覆盖索引,相比执行速度快很多。
    5、Using join buffer
    Using join buffer:在我们联表查询的时候,如果表的连接条件没有用到索引,需要有一个连接缓冲区来存储中间结果。
    先看一下有索引的情况:连接条件 one_name 、two_name 都用到索引。
    接下来删掉 连接条件 one_name 、two_name 的字段索引。发现Extra 列变成 Using join buffer,type均为全表扫描,这也是SQL优化中需要注意的地方。
    6、Impossible where
    Impossible where:表示在我们用不太正确的where语句,导致没有符合条件的行。
    7、No tables used
    No tables used:我们的查询语句中没有FROM子句,或者有 FROM DUAL子句。
    Extra列的信息非常非常多,这里就不再一一列举了,详见 MySQL官方文档 :https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#jointype_index_merge
    
  6. 解读BTree与B+Tree索引

 1. 数据库系统的设计者巧妙的利用了磁盘预读原理。将一个节点的大小设为等于一个页的大小4k2. 每次新建节点,直接申请了一个页的空间,保证该一个节点物理上也有存储在一个页里。加之计算机存储分配都是按页对齐实现一个Node只需一次I/O3. B-Tree一次检索只需要h-1次I/O(根节点常驻内存),渐进复杂度O(h)=O(logdN),出度d是非常大的数字超过100,因此h非常小(通常不超过3)4. 红黑树,h明显深很多,由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性的预读,红黑树的I/O渐进复杂度为O(h)5. B+Tree适合外存,d越大索引的性能越好,出度的上限取决于节点内key和data的大小。内节点去掉了data域。因此可以拥有更大的出度,拥有了更好的性能
  1. sql慢查询配置及分析
    参考链接
慢查询,顾名思义,执行很慢的查询。有多慢?超过 long_query_time 参数设定的时间阈值(默认10s),就被认为是慢的,是需要优化的。慢查询被记录在慢查询日志里。然而,慢查询日志默认是不开启的,也就是说一般人没玩过这功能。如果你需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的(想想一个SQL要10s就可怕)。慢查询配置
slow_query_log 是否开启慢查询日志
开启:set global slow_query_log = 1;
slow_query_log_file 指定慢查询日志的存储路径及文件(默认和数据文件放一起)
long_query_time 指定记录慢查询日志SQL执行时间得阈值(单位:秒,默认10秒)慢查询解读

第一行:记录时间
第二行:用户名 、用户的IP信息、线程ID号
第三行:执行花费的时间【单位:毫秒】、执行获得锁的时间、获得的结果行数、扫描的数据行数
第四行:这SQL执行的时间戳
第五行:具体的SQL语句慢查询分析工具
慢查询的日志记录非常多,要从里面找寻一条查询慢的日志并不是很容易的事情,一般来说都需要一些工具辅助才能快速定位到需要优化的SQL语句,下面介绍两个慢查询辅助工具mysqldumpslow
bin目录下的工具,汇总除查询条件外其他完全相同的SQL,并将分析结果按照参数中所指定的顺序输出。mysqldumpslow -s r -t 3 ../data/hadoop000-slow.log
-s order (c,t,l,r,at,al,ar)
c:总次数
t:总时间
l:锁的时间
r:总数据行
at,al,ar :t,l,r平均数 【例如:at = 总时间/总次数】-t 指定取前面几天作为结果输出pt_query_digest
与mysqldumpslow工具相比,py_query_digest 工具的分析结果更具体,更完善。
  1. sql优化策略及实战
9. SQL语句的优化:1. 如何选择需要优化的SQL1. 云服务器的慢查询日志2. Nginx响应日志找到相应接口数据模块语句2. Explain和Profile入手1. 任何SQL的优化,都从Explain语句开始;Explain语句能够得到数据库的执行该SQL选择的执行计划;2. 首先明确需要的执行计划,在使用Explain检查;3. 使用profile明确SQL的问题和优化的结果;3. 永远用小结果集驱动大的结果集4. 在索引中完成排序5. 使用最小的Columns6. 使用最有效的过滤条件7. 避免复杂的join和子查询
10. 索引优化1. 如何选择是否索引1. 数据大于2000条,酌情考虑建索引,索引建的越多,插入越慢2. 选择性的取值范围[0, 1], select count(Distinct(title))/count(*), 越接近1,越适合2. 前缀索引1. 频繁用作查询条件,可以用多个条件的字段前缀用作索引2. 索引的长度要短,索引文件要小,选择性要高
11. 插入数据优化1. InnoDB默认的装载因为为15/16,则开辟一个新页2. 页子节点采用自增主键,B-Tree的页子节点有顺序链表连续性关联性较高。如果不是自增,会频繁移动索引数据分页操作造成大量的碎片,得不到紧凑的索引结构,甚至目标页面从缓存中清掉,再从磁盘上读回来
12. MySQL配置优化:1. MySQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在网络上,那么查询量相当大的时候那么平瓶颈就会出现在网络上,我们可以用mpstat(获取 CPU 相关统计信息), iostat(监控系统设备的IO负载情况), Linux sar命令和vmstat来查看系统的性能状态。2. show status——显示当前状态信息,show processlist——查看当前SQL执行状态,是否表锁;3. 常用配置:- max_connections——允许的同时会话数的上限- max_connect_errors——客户端连接最大的错误允许数量- back_log——操作系统在监听队列中所能保持的连接数,你有非常高的连接率并且出现 “connection refused” 报错,应该增加此处的值- interactive_timeout——服务器关闭交互式连接前等待活动的秒数(默认8小时)- wait_timeout——服务器关闭非交互连接之前等待活动的秒数(默认8小时)- ft_min_word_len——被全文检索索引的最小的字长, 注意在你修改此值之后,你需要重建你的 FULLTEXT 索引
  1. 项目中sql语句的诊断
    原文链接
Profiling是从 mysql5.0.3版本以后才开放的。
启动profile之后,所有查询包括错误的语句都会记录在内。
关闭会话或者set profiling=0 就关闭了。(如果将profiling_history_size参数设置为0,同样具有关闭MySQL的profiling效果。)此工具可用来查询SQL执行状态,System lock和Table lock 花多少时间等等,对定位一条语句的I/O消耗和CPU消耗 非常重要。(SQL 语句执行所消耗的最大两部分资源就是IO和CPU)--在mysql5.7之后,profile信息将逐渐被废弃,mysql推荐使用performance schema

一般情况下,常用以下语句也就够了 :
mysql->SHOW profile CPU,BLOCK IO io FOR query 2;
  1. MySQL主从复制、读写分离高可用方案
    参考链接
目前使用最为广泛的实例架构是采用一主一备 share-nothing 的结构。数据链路支持RLB(负载均衡) + dbnode 与 RLB + proxy + dbnode 两种。为简便起见,本文以proxy 链路,引擎为innodb 的实例为例介绍。
主备同步模式支持半同步,与异步两种方式,强同步在mysql5.7中将被支持。这里简要介绍下三种同步方式的区别:异步模式:主库收到commit 请求后,依次执行:写redo log prepare,写入binlog,写redo log commit,返回客户端成功。半同步模式:主库收到commit 后,依次执行 redo log prepare,写binlog/发往备库(两个步骤并行),等待备库回复收到ack,redo log commit,给用户回复成功。强同步模式:主库收到commit 后,依次执行 redo log prepare,写binlog/发往备库(并行),等待备库fsync到磁盘后,redo log commit ,给用户恢复成功。以上步骤中,写入redo log 步骤受参数innodb_flush_log_at_trx_commit 影响。 分为0,1,2三种设置,具体含义这里不再赘述。写入binlog 步骤受 sync_binlog 参数影响,具体数字含义,也不再赘述。在两个参数双1 条件下,数据最为安全可靠,性能略有下降。本文假设我们都是设置在双1条件下。
  1. MySQL+keepalived实现双主高可用方案
    参考链接
keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换
Keepalived的作用是检测web服务器的状态,如果有一台web服务器、Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web、Mysql服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的WEB和Mysql服务器。
  1. 千万级MySQL分库分表高性能解决方案
    超实用的mysql分库分表策略,轻松解决亿级数据问题
    MySQL千万级大表优化解决方案
1.数据库设计和表创建时就要考虑性能
2.sql的编写需要注意优化
4.分区
4.分表
5.分库- 索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描
- 应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描
- 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段
- 字符字段只建前缀索引
- 字符字段最好不要做主键
- 不用外键,由程序保证约束
- 尽量不用UNIQUE,由程序保证约束
- 使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引*简言之就是使用合适的数据类型,选择合适的索引*# 选择合适的数据类型
(1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob
(2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数
(3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
(4)尽可能使用not null定义字段
(5)尽量少用text,非用不可最好分表# 选择合适的索引列
(1)查询频繁的列,在where,group by,order by,on从句中出现的列
(2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列
(3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好
(4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高:**sql的编写需要注意优化**
- 使用limit对查询结果的记录进行限定
- 避免select *,将需要查找的字段列出来
- 使用连接(join)来代替子查询
- 拆分大的delete或insert语句
- 可通过开启慢查询日志来找出较慢的SQL
- 不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等,查询时要尽可能将操作移至等号右边
- sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库
- OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内
- 不用函数和触发器,在应用程序实现
- 避免%xxx式查询
- 少用JOIN
- 使用同类型进行比较,比如用'123'和'123'比,123和123比
- 尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
- 对于连续数值,使用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5
- 列表数据不要拿全表,要使用LIMIT来分页,每页数量也不要太大
  1. SQL语句执行从10s如何提升到毫秒级
    MySQL千万级大表优化解决方案
explain查询性能优化
  1. 高并发场景下的数据库事务调优
    参考链接

  2. MySQL索引的失效与优化
    参考链接

1.遵从最左前缀原则
2.不要在索引列上进行函数或者四则运算以及(自动或手动)类型转换
3.尽量不要使用select *
5.不要在索引列中使用!=导致索引失效,进而导致全表扫描
6.在索引列中使用like %字符串%会使得索引失效进而会全表扫描
7.字符串不加单引号会索引失效
8.尽量不要使用or关键字
  1. 项目中常见的死锁故障如何快速排查
    参考链接
死锁的故障排查涉及到3张表
INNODE_TRX
INNODB_LOCKS
INNODB_LOCK_WAITS
  1. 索引的底层实现
    参考链接

  2. 为什么索引结构使用B+Tree,而不是hash,二叉树,红黑树

    26. 数据库系统的设计者巧妙的利用了磁盘预读原理。将一个节点的大小设为等于一个页的大小4k
    27. 每次新建节点,直接申请了一个页的空间,保证该一个节点物理上也有存储在一个页里。加之计算机存储分配都是按页对齐实现一个Node只需一次I/O
    28. B-Tree一次检索只需要h-1次I/O(根节点常驻内存),渐进复杂度O(h)=O(logdN),出度d是非常大的数字超过100,因此h非常小(通常不超过3)
    29. 红黑树,h明显深很多,由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性的预读,红黑树的I/O渐进复杂度为O(h)
    30. B+Tree适合外存,d越大索引的性能越好,出度的上限取决于节点内key和data的大小。内节点去掉了data域。因此可以拥有更大的出度,拥有了更好的性能
    
  3. B+Tree与skiplist跳表的区别
    链接

b+树:1.b+树的内部节点没有存储指向关键字具体内容的指针,因此其内部节点相对于b树更小。这就意味着在磁盘存储中,一个块可以容纳更多索引项,查询数据时可有效减少磁盘IO2.查询效率更加稳定,所有数据的查找均是从根节点到叶子节点3.叶子节点之间通过指针来连接,范围扫描将十分简单b树:1.对于在内部节点的数据,可直接得到,不需要根据叶子节点来定位2.范围查询效率很低跳表:1.实现简单,增删节点不需要像b+树、b树一样调整结构2.耗内存(分层结构导致重复存储节点)3.支持范围查询4.并发操作的局部性更小,而树形结构的插入删除可能涉及整棵树的其他部分
  1. 为什么使用自增主键作为索引
    参考
1.从业务上来说
在设计数据库时不需要费尽心思去考虑设置哪个字段为主键。然后是这些字段只是理论上是唯一的,例如使用图书编号为主键,这个图书编号只是理论上来说是唯一的,但实践中可能会出现重复的        情况。所以还是设置一个与业务无关的自增ID作为主键,然后增加一个图书编号的唯一性约束。
2.从技术上来说
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。 总的来说就是可以提高查询和插入的性能。
对InnoDB来说
1: 主键索引既存储索引值,又在叶子节点中存储行的数据,也就是说数据文件本身就是按照b+树方式存放数据的。
2: 如果没有定义主键,则会使用非空的UNIQUE键做主键 ; 如果没有非空的UNIQUE键,则系统生成一个6字节的rowid做主键;
聚簇索引中,N行形成一个页(一页通常大小为16K)。如果碰到不规则数据插入时,为了保持B+树的平衡,会造成频繁的页分裂和页旋转,插入速度比较慢。所以聚簇索引的主键值应尽量是连续增长的值,而不是随机值(不要用随机字符串或UUID)。
故对于InnoDB的主键,尽量用整型,而且是递增的整型。这样在存储/查询上都是非常高效的。知识普及-扇区、块、页
扇区是磁盘的最小存储单元
块是文件系统的最小存储单元,比如你保存一个记事本,即使只输入一个字符,也要占用4KB的存储,这就是最小存储的意思。
页呢?是B+树的最小存储单元
下面用表格总结一下
单元 谁的(归属) 最小大小
扇区 磁盘 512B
文件系统 4K
B+ 16K
  1. 数据库三范式是什么

    35. 第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系 统都满足第一范式数据库表中的字段都是单一属性的,不可再分)
    36. 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足 第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每 个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储 各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
    37. 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三 范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关 键字信息。 >所以第三范式具有如下特征: >>1. 每一列只有一个 值 >>2. 每一行都能区分。 >>3. 每一个表都不包含其他表已经包含 的非主关键字信息。
    
  2. 有哪些优化数据库方面的经验
    39. 用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。
    40. 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性, 那在设计数据库时就去掉外键。
    41. 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
    42. UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结
    果集中不包含重复数据且不需要排序时的话,那么就使用 UNION
    ALL。 >>UNION 和 UNION ALL 关键字都是将两个结果集合并为一 个,但这两者从使用和效率上来说都有所不同。 >1. 对重复结果的处 理:UNION 在进行表链接后会筛选掉重复的记录,Union All 不会去除 重复记录。 >2. 对排序的处理:Union 将会按照字段的顺序进行排 序;UNION ALL 只是简单的将两个结果合并后就返回。
    
  3. 请简述常用的索引种类
    44. 普通索引: 即针对数据库表创建索引
    45. 唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值必须唯一,但允许有空值
    46. 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引
    47. 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。
  4. mysql 数据库中索引的工作机制是什么?
```
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树
```
  1. mysql 的复制原理以及流程

    Mysql 内建的复制功能是构建大型,高性能应用程序的基础。将 Mysql 的数据分布到多个系统上去,这种分布的机制,是通过将 Mysql 的某一台主机的数据
    课   * 复制过程中一
    复制到其它主机(slaves)上,并重新执行一遍来实现的。
    个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。 当一个从服务器连接主服务器时,它通知主服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。 过程如下 1. 主服务器把更新记录到二进制日志文件中。 2. 从服务器把主服务器的二进制日志拷贝到自己的中继日志(replay log)中。 3. 从服务器重做中继日志中的时间,
    把更新应用到自己的数据库上。
    
  2. mysql 支持的复制类型

        1. 基于语句的复制: 在主服务器上执行的 SQL 语句,在从服务器上执行
    同样的语句。MySQL 默认采用基于语句的复制,效率比较高。 一旦发
    现没法精确复制时,会自动选着基于行的复制。2. 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执
    享
    行一遍. 从 mysql5.0 开始支持3. 混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法
    精确的复制时,就会采用基于行的复制。
    
  3. mysql 中 varchar 与 char 的区别以及 varchar(50)中的 50 代表的涵 义?

    49. varchar 与 char 的区别: char 是一种固定长度的类型,varchar 则是
    一种可变长度的类型.
    50. varchar(50)中 50 的涵义 : 最多存放 50 个字节
    51. int(20)中 20 的涵义: int(M)中的 M indicates the maximum
    display width (最大显示宽度)for integer types. The maximum
    legal display width is 255.
    
  4. MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

    53. Read Uncommitted(读取未提交内容) >> 在该隔离级别,所有事
    务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应
    用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称
    2.之为脏读(学Dirty Read)。
    Read Committed(读取提交内容) >> 这是大多数数据库系统的默
    认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一
    个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的
    不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该
    实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结
    果。
    54. Repeatable Read(可重读) >> 这是 MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(PhantomRead)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。
    55. Serializable(可串行化) >> 这是最高的隔离级别,它通过强制事务
    排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个表中有大字段 X(例如:text 类型),且字段课X不会经常更新,以读为为主,将该字段拆成子表好处是什么?
    
  5. 表中有大字段 X(例如:text 类型),且字段 X 不会经常更新,以读为 为主,将该字段拆成子表好处是什么

    如果字段里面有大字段(text,blob)类型的,而且这些字段的访问并不多,这时候放在一起就变成缺点了。 MYSQL 数据库的记录存储是按行存储的,数据享块大小又是固定的(16K),每条记录越小,相同的块存储的记录就越多。此时应该把大字段拆走,这样应付大部分小字段的查询时,就能提高效率。当需要查询大字段时,此时的关联查询是不可避免的,但也是值得的。拆分开后,对字段的 UPDAE 就要 UPDATE 多个表了
    
  6. MySQL 中 InnoDB 引擎的行锁是通过加在什么上完成的(或称实现)

    InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与 Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB 这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁!
    
  7. MySQL 中控制内存分配的全局参数,有哪些?

    59. Keybuffersize: > * keybuffersize 指定索引缓冲区的大小, 它决定索引处理的速度,尤其是索引读的速度。通过检查状态值
    Keyreadrequests 和 Keyreads,可以知道 keybuffersize 设置是否 合理。比例 keyreads /keyreadrequests 应该尽可能的低,至少是 1:100,1:1000 更好(上述状态值可以使用 SHOW STATUS LIKE ‘keyread%'获得)。 > * keybuffersize 只对 MyISAM 表起作用。 即使你不使用 MyISAM 表,但是内部的临时磁盘表是 MyISAM 表,也 要使用该值。可以使用检查状态值 createdtmpdisktables 得知详情。 对于 1G 内存的机器,如果不使用 MyISAM 表,推荐值是 16M(8- 64M) > * keybuffersize 设置注意事项 >>>1. 单个 keybuffer 的 大小不能超过 4G,如果设置超过 4G,就有可能遇到下面 3 个
    bug: >>>>> http://bugs.mysql.com/bug.php?id=29446 <br /> >>>>> http://bugs.mysql.com/bug.php?id=29419 <br /> >>>>> http://bugs.mysql.com/bug.php?id=5731 <br />>>>2. 建议keybuffer设置为物理内存的1/4(针对MyISAM引 擎),甚至是物理内存的 30%~40%,如果 keybuffersize 设置太大, 系统就会频繁的换页,降低系统性能。因为 MySQL 使用操作系统的缓 存来缓存数据,所以我们得为系统留够足够的内存;在很多情况下数据 要比索引大得多。 >>>3. 如果机器性能优越,可以设置多个 keybuffer,分别让不同的 keybuffer 来缓存专门的索引
    60. innodbbufferpool_size > 表示缓冲池字节大小,InnoDB 缓存 表和索引数据的内存区域。mysql 默认的值是 128M。最大值与你的 CPU 体系结构有关,在 32 位操作系统,最大值是 4294967295 (2^32-1) ,在 64 位操作系统,最大值为 18446744073709551615 (2^64-1)。 > 在 32 位操作系统中, CPU 和操作系统实用的最大大小低于设置的最大值。如果设定的缓冲池 的大小大于 1G,设置 innodbbufferpoolinstances 的值大于 1. > * 数据读写在内存中非常快, innodbbufferpoolsize 减少了对磁盘的读 写。 当数据提交或满足检查点条件后才一次性将内存数据刷新到磁盘 中。然而内存还有操作系统或数据库其他进程使用, 一般设置 buffer pool 大小为总内存的 3/4 至 4/5。 若设置不当, 内存使用可能浪费 或者使用过多。 对于繁忙的服务器, buffer pool 将划分为多个实例以 提高系统并发性, 减少线程间读写缓存的争用。buffer pool 的大小首 先受 innodbbufferpool_instances 影响, 当然影响较小。
    61. querycachesize > 当 mysql 接收到一条 select 类型的 query 时,mysql 会对这条 query 进行 hash 计算而得到一个 hash 值,然后 通过该 hash 值到 query cache 中去匹配,如果没有匹配中,则将这个 hash 值存放在一个 hash 链表中,同时将 query 的结果集存放进 cache 中,存放 hash 值的链表的每一个 hash 节点存放了相应 query 结果集在 cache 中的地址,以及该 query 所涉及到的一些 table 的相 关信息;如果通过 hash 值匹配到了一样的 query,则直接将 cache 中 相应的 query 结果集返回给客户端。如果 mysql 任何一个表中的任何 一条数据发生了变化,便会通知 query cache 需要与该 table 相关的 query 的 cache 全部失效,并释放占用的内存地址。 > query cache 优缺点 >> 1. query 语句的 hash 计算和 hash 查找带来的资源消耗。mysql 会对每条接收到的 select 类型的 query 进行 hash 计算然 后查找该 query 的 cache 是否存在,虽然 hash 计算和查找的效率已 经足够高了,一条 query 所带来的消耗可以忽略,但一旦涉及到高并 发,有成千上万条 query 时,hash 计算和查找所带来的开销就的重视 了; >> 2. query cache 的失效问题。如果表变更比较频繁,则会造 成 query cache 的失效率非常高。表变更不仅仅指表中的数据发生变 化,还包括结构或者索引的任何变化; >> 3. 对于不同 sql 但同一结 果集的 query 都会被缓存,这样便会造成内存资源的过渡消耗。sql 的 字符大小写、空格或者注释的不同,缓存都是认为是不同的 sql(因为 他们的 hash 值会不同); >> 4. 相关参数设置不合理会造成大量内 存碎片,相关的参数设置会稍后介绍。
    62. readbuffersize >是 MySQL 读入缓冲区大小。对表进行顺序扫描 的请求将分配一个读入缓冲区,MySQL 会为它分配一段内存缓冲区。 readbuffersize 变量控制这一缓冲区的大小。如果对表的顺序扫描请求 非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以 及内存缓冲区大小提高其性能。
    
  8. 若一张表中只有一个字段 VARCHAR(N)类型,utf8 编码,则 N 最大值为多少(精确到数量级即可)?

    由于 utf8 的每个字符最多占用 3 个字节。而 MySQL 定义行的长度不能超过65535,因此 N 的最大值计算方法为:(65535-1-2)/3。减去 1 的原因是实际存储从第二个字节开始,减去 2 的原因是因为要在列表长度存储实际的字符长度,除以 3 是因为 utf8 限制:每个字符最多占用 3 个字节。
    
  9. [SELECT *] 和[SELECT 全部字段]的 2 种写法有何优缺点?

    65. 前者要解析数据字典,后者不需要
    66. 结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。
    67. 表字段改名,前者不需要修改,后者需要改
    68. 后者可以建立索引进行优化,前者无法优化
    69. 后者的可读性比前者要高
    
  10. HAVNG 子句 和 WHERE 的异同点?

    71.    语法上:where 用表中列名,having 用 select 结果别名
    72. 影响结果范围:学where 从表读出数据的行数,having 返回客户端的行数
    73. 索引:where 可以使用索引,having 不能使用索引,只能在临时结果集操作
    74. where 后面不能使用聚集函数,having 是专门使用聚集函数的。
    
  11. MySQL 当记录不存在时 insert,当记录存在时 update,语句怎么写?

    INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY
    
  12. MySQL 的 insert 和 update 的 select 语句语法

    Insert into  student(stuid, stuname, deptid) select 10, 'xzm', 3 from student where stuid >8;
    Update student a inner join student b on b.stuID = 10 set a.stuname=concat(b.stuname, b.stuID) where a.stuID=10;
    

1、一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ?

(1)如果表的类型是 MyISAM,那么是 18

因为 MyISAM 表会把自增主键的最大 ID 记录到数据文件里,重启 MySQL 自增主键的最大 ID 也不会丢失

(2)如果表的类型是 InnoDB,那么是 15

InnoDB 表只是把自增主键的最大 ID 记录到内存中,所以重启数据库或者是对表进行 OPTIMIZE 操作,都会导致最大 ID 丢失

2、Mysql 的技术特点是什么?

Mysql 数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程 SQL 服务器、不同的后端、广泛的应用程序编程接口和管理工具。

3、Heap 表是什么?

HEAP 表存在于内存中,用于临时高速存储。

BLOB 或 TEXT 字段是不允许的

只能使用比较运算符=,<,>,=>,= <

HEAP 表不支持 AUTO_INCREMENT

索引不可为 NULL

4、Mysql 服务器默认端口是什么?

Mysql 服务器的默认端口是 3306。

5、与 Oracle 相比,Mysql 有什么优势?

Mysql 是开源软件,随时可用,无需付费。

Mysql 是便携式的

带有命令提示符的 GUI。

使用 Mysql 查询浏览器支持管理

6、如何区分 FLOAT 和 DOUBLE?

以下是 FLOAT 和 DOUBLE 的区别:

浮点数以 8 位精度存储在 FLOAT 中,并且有四个字节。

浮点数存储在 DOUBLE 中,精度为 18 位,有八个字节。

7、区分 CHAR_LENGTH 和 LENGTH?

CHAR_LENGTH 是字符数,而 LENGTH 是字节数。Latin 字符的这两个数据是相同的,但是对于 Unicode 和其他编码,它们是不同的。

8、请简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

SQL 标准定义的四个隔离级别为:

read uncommited :读到未提交数据

read committed:脏读,不可重复读

repeatable read:可重读

serializable :串行事物

9、在 Mysql 中 ENUM 的用法是什么?

ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。

Create table size(name ENUM('Smail,‘Medium’,‘Large’);

10、如何定义 REGEXP?

REGEXP 是模式匹配,其中匹配模式在搜索值的任何位置。

11、CHAR 和 VARCHAR 的区别?

以下是 CHAR 和 VARCHAR 的区别:

CHAR 和 VARCHAR 类型在存储和检索方面有所不同

CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255

当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。

12、列的字符串类型可以是什么?

字符串类型是:

SET

BLOB

ENUM

CHAR

TEXT

VARCHAR

13、如何获取当前的 Mysql 版本?

SELECT VERSION();用于获取当前 Mysql 的版本。

14、Mysql 中使用什么存储引擎?

存储引擎称为表类型,数据使用各种技术存储在文件中。

技术涉及:

Storage mechanism

Locking levels

Indexing

Capabilities and functions.

15、Mysql 驱动程序是什么?

以下是 Mysql 中可用的驱动程序:

PHP 驱动程序

JDBC 驱动程序

ODBC 驱动程序

CWRAPPER

PYTHON 驱动程序

PERL 驱动程序

RUBY 驱动程序

CAP11PHP 驱动程序

Ado.net5.mxj

16、TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?

创建表时 TIMESTAMP 列用 Zero 更新。只要表中的其他字段发生更改,UPDATE CURRENT_TIMESTAMP 修饰符就将时间戳字段更新为当前时间。

17、主键和候选键有什么区别?

表格的每一行都由主键唯一标识,一个表只有一个主键。

主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

18、如何使用 Unix shell 登录 Mysql?

我们可以通过以下命令登录:

[mysql dir]/bin/mysql -h hostname -u

19、 myisamchk 是用来做什么的?

它用来压缩 MyISAM 表,这减少了磁盘或内存使用。

20、MYSQL 数据库服务器性能分析的方法命令有哪些?

21、如何控制 HEAP 表的最大尺寸?

Heal 表的大小可通过称为 max_heap_table_size 的 Mysql 配置变量来控制。

22、MyISAM Static 和 MyISAM Dynamic 有什么区别?

在 MyISAM Static 上的所有字段有固定宽度。动态 MyISAM 表将具有像 TEXT,BLOB 等字段,以适应不同长度的数据类型。点击这里有一套最全阿里面试题总结。

MyISAM Static 在受损情况下更容易恢复。

23、federated 表是什么?

federated 表,允许访问位于其他服务器数据库上的表。

24、如果一个表有一列定义为 TIMESTAMP,将发生什么?

每当行被更改时,时间戳字段将获取当前时间戳。

25、列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?

它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。

26、怎样才能找出最后一次插入时分配了哪个自动增量?

LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值,并且不需要指定表名称。

27、你怎么看到为表格定义的所有索引?

索引是通过以下方式为表格定义的:

SHOW INDEX FROM

28.、LIKE 声明中的%和_是什么意思?

%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。

29、如何在 Unix 和 Mysql 时间戳之间进行转换?

UNIX_TIMESTAMP 是从 Mysql 时间戳转换为 Unix 时间戳的命令 FROM_UNIXTIME 是从 Unix 时间戳转换为 Mysql 时间戳的命令30、列对比运算符是什么?

在 SELECT 语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR 或 LIKE 运

算符。

31、我们如何得到受查询影响的行数?

行数可以通过以下代码获得:

SELECT COUNT(user_id)FROM users;

32、Mysql 查询是否区分大小写?

不区分

SELECT VERSION(), CURRENT_DATE;

SeLect version(), current_date;

seleCt vErSiOn(), current_DATE;

所有这些例子都是一样的,Mysql 不区分大小写。

33.、LIKE 和 REGEXP 操作有什么区别?

LIKE 和 REGEXP 运算符用于表示^和%。

SELECT * FROM employee WHERE emp_name REGEXP “^b”; SELECT * FROM employee WHERE emp_name LIKE “%b”; 34.、BLOB 和 TEXT 有什么区别?

BLOB 是一个二进制对象,可以容纳可变数量的数据。有四种类型的 BLOB -

TINYBLOB

BLOB

MEDIUMBLOB 和

LONGBLOB

它们只能在所能容纳价值的最大长度上有所不同。

TEXT 是一个不区分大小写的 BLOB。四种 TEXT 类型

TINYTEXT

TEXT

MEDIUMTEXT 和

LONGTEXT

它们对应于四种 BLOB 类型,并具有相同的最大长度和存储要求。

BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT 值不区分大小写。

35、mysql_fetch_array 和 mysql_fetch_object 的区别是什么?

以下是 mysql_fetch_array 和 mysql_fetch_object 的区别:

mysql_fetch_array() - 将结果行作为关联数组或来自数据库的常规数组返回。

mysql_fetch_object - 从数据库返回结果行作为对象。

36、我们如何在 mysql 中运行批处理模式?

以下命令用于在批处理模式下运行:

mysql;

mysql mysql.out

37、MyISAM 表格将在哪里存储,并且还提供其存储格式?

每个 MyISAM 表格以三种格式存储在磁盘上:

·“.frm”文件存储表定义

·数据文件具有“.MYD”(MYData)扩展名

索引文件具有“.MYI”(MYIndex)扩展名

38.、Mysql 中有哪些不同的表格?

共有 5 种类型的表格:

MyISAM

Heap

Merge

INNODB

ISAM

MyISAM 是 Mysql 的默认存储引擎。

39、ISAM 是什么?

ISAM 简称为索引顺序访问方法。它是由 IBM 开发的,用于在磁带等辅助存储系统上存储和检索数据。

40、InnoDB 是什么?

lnnoDB 是一个由 Oracle 公司开发的 Innobase Oy 事务安全存储引擎。

41、Mysql 如何优化 DISTINCT?

DISTINCT 在所有列上转换为 GROUP BY,并与 ORDER BY 子句结合使用。

1

SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;

42、如何输入字符为十六进制数字?

如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀(X),或者只用(Ox)前缀输入十六进制数字。

如果表达式上下文是字符串,则十六进制数字串将自动转换为字符串。

43、如何显示前 50 行?

在 Mysql 中,使用以下代码查询显示前 50 行:

SELECT*FROM

LIMIT 0,50;

44、可以使用多少列创建索引?

任何标准表最多可以创建 16 个索引列。

45、NOW()和 CURRENT_DATE()有什么区别?

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。

CURRENT_DATE()仅显示当前年份,月份和日期。

46、什么样的对象可以使用 CREATE 语句创建?

以下对象是使用 CREATE 语句创建的:

DATABASE

EVENT

FUNCTION

INDEX

PROCEDURE

TABLE

TRIGGER

USER

VIEW

47、Mysql 表中允许有多少个 TRIGGERS?

在 Mysql 表中允许有六个触发器,如下:

BEFORE INSERT

AFTER INSERT

BEFORE UPDATE

AFTER UPDATE

BEFORE DELETE

AFTER DELETE

48、什么是非标准字符串类型?

以下是非标准字符串类型:

TINYTEXT

TEXT

MEDIUMTEXT

LONGTEXT

49、什么是通用 SQL 函数?

CONCAT(A, B) - 连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。

FORMAT(X, D)- 格式化数字 X 到 D 有效数字。

CURRDATE(), CURRTIME()- 返回当前日期或时间。

NOW() - 将当前日期和时间作为一个值返回。

MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() - 从日期值中提取给定数据。

HOUR(),MINUTE(),SECOND() - 从时间值中提取给定数据。

DATEDIFF(A,B) - 确定两个日期之间的差异,通常用于计算年龄

SUBTIMES(A,B) - 确定两次之间的差异。

FROMDAYS(INT) - 将整数天数转换为日期值。

50、解释访问控制列表

ACL(访问控制列表)是与对象关联的权限列表。这个列表是 Mysql 服务器安全模型的基础,它有助于排除用户无法连接的问题。

Mysql 将 ACL(也称为授权表)缓存在内存中。当用户尝试认证或运行命令时,Mysql 会按照预定的顺序检查 ACL 的认证信息和权限。

51、MYSQL 支持事务吗?

在缺省模式下,MYSQL 是 autocommit 模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql 是不支持事务的。

但是如果你的 MYSQL 表类型是使用 InnoDB Tables 或 BDB tables 的话,你的 MYSQL 就可以使用事务处理,使用 SET AUTOCOMMIT=0 就可以使 MYSQL 允许在非 autocommit 模式,在非 autocommit 模式下,你必须使用 COMMIT 来提交你的更改,或者用 ROLLBACK 来回滚你的

更改。

示例如下:

START TRANSACTION;

SELECT @A:=SUM(salary) FROM table1 WHERE type=1;

UPDATE table2 SET summmary=@A WHERE type=1;

COMMIT;

52、mysql 里记录货币用什么字段类型好

NUMERIC 和 DECIMAL 类型被 Mysql 实现为同样的类型,这在 SQL92 标准允许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定;点击这里有一套最全阿里面试题总结。

例如:

salary DECIMAL(9,2)

在这个例子中,9(precision)代表将被用于存储值的总的小数位数,而 2(scale)代表将被用于存储小数点后的位数。

因此,在这种情况下,能被存储在 salary 列中的值的范围是从-9999999.99 到 9999999.99。

在 ANSI/ISO SQL92 中,句法 DECIMAL§等价于 DECIMAL(p,0)。

同样,句法 DECIMAL 等价于 DECIMAL(p,0),这里实现被允许决定值 p。Mysql 当前不支持 DECIMAL/NUMERIC 数据类型的这些变种形式的任一种。

这一般说来不是一个严重的问题,因为这些类型的主要益处得自于明显地控制精度和规模的能力。

DECIMAL 和 NUMERIC 值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。

一个字符用于值的每一位、小数点(如果 scale>0)和“-”符号(对于负值)。如果 scale 是 0, DECIMAL 和 NUMERIC 值不包含小数点或小数部分。

DECIMAL 和 NUMERIC 值得最大的范围与 DOUBLE 一样,但是对于一个给定的 DECIMAL 或 NUMERIC 列,实际的范围可由制由给定列的 precision 或 scale 限制。

当这样的列赋给了小数点后面的位超过指定 scale 所允许的位的值,该值根据 scale 四舍五入。

当一个 DECIMAL 或 NUMERIC 列被赋给了其大小超过指定(或缺省的)precision 和 scale 隐含的范围的值,Mysql 存储表示那个范围的相应的端点值。

我希望本文可以帮助你提升技术水平。那些,感觉学的好难,甚至会令你沮丧的人,别担心,我认为,如果你愿意试一试本文介绍的几点,会向前迈进,克服这种感觉。这些要点也许对你不适用,但你会明确一个重要的道理:接受自己觉得受困这个事实是摆脱这个困境的第一步。

53、MYSQL 数据表在什么情况下容易损坏?

服务器突然断电导致数据文件损坏。

强制关机,没有先关闭 mysql 服务等。

54、mysql 有关权限的表都有哪几个?

Mysql 服务器通过权限表来控制用户对数据库的访问,权限表存放在 mysql 数据库里,由 mysql_install_db 脚本初始化。这些权限表分别 user,db,table_priv,columns_priv 和host。

55、Mysql 中有哪几种锁?

MyISAM 支持表锁,InnoDB 支持表锁和行锁,默认为行锁

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低

行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高

  1. MySQL中有哪几种锁

    1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
    2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
  2. MySQL中有哪些不同的表格

    有5种
    - MyISAM
    - Heap
    - Merge
    - InnoDB
    - ISAM
    
  3. MyISAM与InnoDB区别
    参考

    ACID:
    原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    一致性(Consistency)
    事务前后数据的完整性必须保持一致。
    隔离性(Isolation)
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
    持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响MyISAM:
    不支持事务,但是每次查询都是原子的;
    支持表级锁,即每次操作是对整个表加锁;
    储存表的总行数;
    一个MyISAM表有三个文件:索引文件、表结构文件、数据文件;
    采用非聚集索引,索引文件的数据储存指向数据文件的指针。辅助索引与主索引基本一致,但是辅助索引不用保证唯一性。
    非聚簇索引:存放了表数据的物理地址和key值,可根据key值对应的物理地址再查询具体的行值,但是物理地址存放的顺序和表存放的逻辑顺序没有强一致性!InnoDB:
    支持ACID的事务,支持事务的4种隔离级别;
    支持行级锁及外键约束,因此可以支持写并发;
    不存储总行数;
    一个InnoDB引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空间,表大小受操作系统文件大小限制,一般为2G);
    主键索引采用聚集索引(索引的数据域存储数据文件本身),辅助索引的数据域存储主键的值;因此从辅助索引查找数据,需要先通过辅助索引找到主键值,再访问辅助索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整
    主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚集索引(clustered index)。
    非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。这个索引由独立的B+树来组织。有两种常见的方法可以解决多个B+树访问同一套表数据的问题,一种叫做聚簇索引(clustered index ),一种叫做非聚簇索引(secondary index)。这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式。对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树。对于非聚簇索引存储来说,主键B+树在叶子节点存储指向真正数据行的指针,而非主键。InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。我们重点关注聚簇索引,看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过两次B+树查找,这不是多此一举吗?聚簇索引的优势在哪?
    1 由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键Id来组织数据,获得数据更快。
    2 辅助索引使用主键作为"指针" 而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时辅助索引的维护工作,使用主键值当作指针会让辅助索引占用更多的空间,换来的好处是InnoDB在移动行时无须更新辅助索引中的这个"指针"。也就是说行的位置(实现中通过16K的Page来定位,后面会涉及)会随着数据库里数据的修改而发生变化(前面的B+树节点分裂以及Page的分裂),使用聚簇索引就可以保证不管这个主键B+树的节点如何变化,辅助索引树都不受影响。
    单个Page的大小是16K,双项链表,有头尾体
    
  4. char和varchar的区别

    1. char和varchar类型在存储和检索方法有所不同
    2. char列长度固定为创建表时声明的长度,长度范围是1到255
    3. 当char值被存储是,它们被用空格填充到特定长度,检索char时需要删除尾随空格
  5. 主键和候选建的区别
    表格的每一行都由主键唯一标识,一个表只有一个主键。
    主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用

  6. myisamchk是用来做什么的
    它用来压缩MyISAM表,减少磁盘或内存使用
    在 MyISAM static上所有字段有固定宽度,在受损情况下更容易恢复。

  7. 怎么看到表格定义的所有索引
    SHOW INDEX FROM ;

  8. MySQL “%” “”区别
    %代表多个或者0个任意字符,“
    ”代表一个任意字符

  9. MySQL列对比运算符是什么
    select中使用“=,<>,<=,<,>,>=,<<,>>,and,or,like”

  10. BLOB和TEXT有什么区别
    BLOB是一个二进制对象,可以容纳可变数量的数据。TEXT是一个不区分大小写的BLOB。
    BLOB和TEXT类型之间的唯一区别在于对BLOB值进行排序和比较时区分大小写,对TEXT值不区分大小写。

  11. MySQL如何优化DISTINCT
    DISTINCT在所有列上转换为GROUP BY, 并为ORDER BY子句结合使用

  12. 可以使用多少列创建索引
    任何标准表中最多可以创建16个索引列

  13. NOW()和CURRENT_DATE()有什么区别
    NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒
    CURRENT_DATE()仅显示当前年份,月份,日期

  14. 什么是非标准字符串类型

    • TINYTEXT
    • TEXT
    • MEDIUMTEXT
    • LONGTEXT
  15. 什么是通用SQL函数

    • CONCAT(A,B):连接两个字符串值以创建单个字符串输出。通常用于两个或多个字段合并为一个字段
    • FORMAT(X,D):格式化数字X到D有效数字
    • CURRDATE(),CURRTIME():返回当前日期或时间
    • NOW():当前日期和时间作为一个值返回
    • MONTH,DAY,YEAR,WEEK,WEEKDAY,HOUR,MINUTE,SECOND:从时间中提取给定数据
    • DATEDIFF(A,B):确定两个日期之间的差异,通常用于计算年龄
    • SUBTIMES(A,B):确定两次之间的差异
    • FROMDAYS(INT):将整数天数转换为日期值
  16. MySQL有关权限的表都有哪几个
    MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在MySQL数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。

  17. 锁的优化策略

    1. 读写分离
    2. 分段加锁
    3. 减少锁持有的时间
    4. 多个线程尽量以相同的顺序去获取资源
  18. 锁的优化策略

    1. 读写分离
    2. 分段加锁
    3. 减少锁持有的时间
    4. 多个线程尽量以相同的顺序获取资源
    5. 不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁
  19. 实践中如何优化MySQL

    1. SQL语句及索引的优化
    2. 数据表结构的优化
    3. 系统配置的优化
    4. 硬件的优化
  20. SQL注入漏洞产生的原因

    1. 过滤关键字:update insert delete select *
    2. 尽量不要省略双引号和单引号
  21. MySQL中的事务回滚机制概述
    事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。
    要同时修改数据库中两个不同表时,如果他们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经修改完毕。而当你把他们设定一个事务的时候,当第一个表修改完,第二个表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。

  22. SQL语句包括几部分?每部分有几个关键字?

    • DDL:数据定义 create table,alter table
    • DML:数据操纵 select,insert, update, delete
    • DCL:数据控制 grant, revoke
    • DQL:数据查询 select
  23. 反范式是什么
    反范式与三范式相反
    优点:可以减少表的关联,可以更好的进行索引优化
    缺点:数据冗余以及数据异常,数据得修改需要更多的成本

  24. 语句优化提高三倍

    1. explain: • type 列,连接类型。一个好的 SQL 语句至少要达到 range 级别。杜绝出现all 级别。• key 列,使用到的索引名。如果没有选择索引,值是 NULL。可以采取强制索引方式。• key_len 列,索引长度。• rows 列,扫描行数。该值是个预估值。• extra 列,详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。
    2. SQL 语句中 IN 包含的值不应过多, 能用between就别用in,in会排序
    3. SELECT 语句务必指明字段名称
    4. 当只需要一条数据的时候,使用 limit 1  <这是为了使 EXPLAIN 中 type 列达到 const 类型>
    5. 如果排序字段没有用到索引,就尽量少排序
    6. 如果限制条件中其他字段没有索引,尽量少用 or
    7. 尽量用 union all 代替 union
    8. 不使用 ORDER BY RAND()
    9. 区分 in 和 exists、not in 和 not existsselect * from 表 A where id in (select id from 表 B)上面 SQL 语句相当于select * from 表 A where exists(select * from 表 B where 表 B.id=表 A.id)区分 in 和 exists 主要是造成了驱动顺序的改变(这是性能变化的关键),如 果是 exists,那么以外层表为驱动表,先被访问,如果是 IN,那么先执行子 查询。所以 IN 适合于外表大而内表小的情况;EXISTS 适合于外表小而内表大的情况。关于 not in 和 not exists,推荐使用 not exists,不仅仅是效率问题,not in 可能存在逻辑问题。如何高效的写出一个替代 not exists 的 SQL 语句?原 SQL 语句:select colname ... from A 表 where a.id not in (select b.id from B 表)高效的 SQL 语句:select colname ... from A 表 Left join B 表 on where a.id = b.id where b.id is null
    10. 使用合理的分页方式以提高分页的效率select id,name from product limit 866613, 20更好的:select id,name from product where id> 866612 limit 20
    11. 分段查询
    12. 免在 where 子句中对字段进行 null 值判断,尽量不要使用非空字段
    13. 不建议使用%前缀模糊查询,可以使用 LIKE “name%”
    

MySQL资料总结(下)—— MySQL常见面试题相关推荐

  1. css使两个盒子并列_CSS常见面试题

    阅读本文约需要9分钟 大家好,我是小蔡,接下来开始今天的技术分享!上段时间跟大家分享了Vue 之响应式系统的知识,今天跟大家分享下CSS常见面试题的知识. 1 介绍一下标准的CSS的盒子模型?与低版本 ...

  2. for vue 一行2列_vue常见面试题汇总

    点击"卓跃教育",选择"星标?" 在看|星标|留言,  真爱 今天跟大家分享下Vue常见面试题的知识. 1.vue优点? 答:轻量级框架:只关注视图层,是一个构 ...

  3. laravel mysql sum查询并排行_必看!PHP常见面试题——MySQL篇(二)

    接上期:<必看!PHP常见面试题--MySQL篇(一)> 11.MySQL的默认事务隔离级别是? 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到. 读提交(RC): ...

  4. 面试被问Mysql没答上来?阿里P5:总结了55道常见面试题,收藏一波

    转载自  面试被问Mysql没答上来?阿里P5:总结了55道常见面试题,收藏一波 正文开始前,分享阿里 P8 高级架构师吐血总结的 <Java 核心知识体系&面试资料.pdf>, ...

  5. mysql关于时间的面试题,mysql时间设置默认值MySQL常见面试题

    1.limit(选出10 到20 条) select * from students order by id limit 9,10; 2.MySQL 会使用索引的操作符号 =,>,=,betwe ...

  6. MySQL常见面试题及答案汇总1000道(春招+秋招+社招)

    MySQL面试题以及答案整理[最新版]MySQL高级面试题大全(2021版),发现网上很多MySQL面试题都没有答案,所以花了很长时间搜集,本套MySQL面试题大全,汇总了大量经典的MySQL程序员面 ...

  7. 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)

    title: 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了) tags: 面试常见题 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈 ...

  8. mysql某个表的列除以2_mysql常见面试题(二)

    mysql常见面试题(二) 标签:范式 索引 复制原理 事务引擎 储存结构 内存分配 1.数据库三范式是什么? 第一范式(1NF):字段具有原子性,不可再分.(所有关系型数据库系统都满足第一范式数据库 ...

  9. MySQL数据库常见面试题总结

    1.数据库的常用范式: 第一范式(1NF):指表的列不可再分,数据库中表的每一列都是不可分割的基本数据项,同一列中不能有多个值: 第二范式(2NF):在 1NF 的基础上,还包含两部分的内容:一是表必 ...

  10. 【MySQL】索引常见面试题

    文章目录 索引常见面试题 什么是索引 索引的分类 什么时候需要 / 不需要创建索引? 有什么优化索引的方法? 从数据页的角度看B + 树 InnoDB是如何存储数据的? B + 树是如何进行查询的? ...

最新文章

  1. MTU(最大传输单元)
  2. memcached failed to listen问题解决以及 结束daemon的方法
  3. 机器学习该如何应用到量化投资系列(二)
  4. ubuntu取消主目录加密_如何在Ubuntu上恢复加密的主目录
  5. Flux --gt; Redux --gt; Redux React 入门 基础实例教程
  6. 前端学习(11):标题和段落
  7. java protobuf extend_如何使用protobuf extend和编写protobuf插件
  8. openstack trove实例状态转换条件--Mitaka版本
  9. 单片机温度传感器c语言编码,基于单片机的温度传感器18b20的C语言程序
  10. 【实战篇】微信公众号网页授权登录实现起来如此简单
  11. 利用wordcloud和jieba制作词云
  12. 有关公司治理的一些收获
  13. dubbo入门之异步调用
  14. 地磁基本知识(四)磁异常的解释及卫星磁测
  15. MFC对话框动态背景(定时器)
  16. 免费资源-成语答题小程序源码+教程
  17. java中正则表达式以及Pattern和Matcher
  18. 智能车竞赛:关于车模系列的价格调整
  19. 《那些年啊,那些事——一个程序员的奋斗史》——05
  20. 前端 vue 制作一个日历(一)

热门文章

  1. ZSV08-31、DHF08-231、SV08-B20M、LSV-08-2NCP-M插装式电磁阀Z
  2. 关于国际化语言I18工具类多语言处理
  3. 免费AI绘画网站推荐,6个好用的AI画画生成网站
  4. 职场神器:只需三分钟,AI工具让我变成插画师
  5. wireguard研究
  6. mouseout事件被不断触发
  7. SpringBoot定时发送邮件
  8. AJAX框架衣柜内部改造,让衣柜鲜活起来 非拆改式租房改造案例赏析(图)
  9. 拆解康耐特光学赴港上市:业绩增速有所放缓,持续增长能力存疑
  10. 后端技术大全!建议收藏