原标题:MySQL数据库快问快答

前言

今天楼主给大家列一下关于数据库几个常见问题的要点,如果大家对其中的问题感兴趣,可以自行扩展研究。

1. UNION ALL 与 UNION 的区别

UNION和UNION ALL关键字都是将两个结果集合并为一个。

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

而UNION ALL只是简单的将两个结果合并后就返回。

由于UNION需要排序去重,所以 UNION ALL 的效率比 UNION 好很多。

2. TRUNCATE 与 DELETE 区别

TRUNCATE 是DDL语句,而 DELETE 是DML语句。

TRUNCATE 是先把整张表drop调,然后重建该表。而 DELETE 是一行一行的删除,所以 TRUNCATE 的速度肯定比 DELETE 速度快。

TRUNCATE 不可以回滚,DELETE 可以。

TRUNCATE 执行结果只是返回0 rows affected,可以解释为没有返回结果。

TRUNCATE 会重置水平线(自增长列起始位),DELETE 不会。

TRUNCATE 只能清理整张表,DELETE 可以按照条件删除。

一般情景下,TRUNCATE性能比DELETE好一点。

3. TIMESTAMP 与 DATETIME 的区别

相同点

TIMESTAMP 列的显示格式与 DATETIME 列相同。显示列宽固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。

不同点

TIMESTAMP

4个字节存储,时间范围:1970-01-01 08:00:01~2038-01-19 11:14:07。

值以UTC格式保存,涉及时区转化,存储时对当前的时区进行转换,检索时再转换回当前的时区。

DATETIME

8个字节存储,时间范围:1000-10-01 00:00:00~9999-12-31 23:59:59。

实际格式存储,与时区无关。

4. 什么是联合索引

两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。

5. 为什么要使用联合索引

减少开销: 建一个 联合索引( col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。减少磁盘空间的开销。

覆盖索引: 对联合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。覆盖索引是主要的提升性能的优化手段之一。

效率高: 索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下sql select from table where col1=1 and col2=2 and col3=3 ,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出 1000W * 10%=100w 条数据,然后再回表从100w条数据中找到符合 col2=2 and col3= 3 的数据,然后再排序,再分页;如果是联合索引,通过索引筛选出 1000w * 10% * 10% * 10%=1w ,效率得到明显提升。

6. MySQL 联合索引最左匹配原则

在 MySQL 建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

MySQL 会一直向右匹配直到遇到范围查询(>、 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

7. 什么是聚集和非聚集索引

聚集索引就是以主键创建的索引。

非聚集索引就是以非主键创建的索引。

8. 什么是覆盖索引

覆盖索引(covering index)指一个查询语句的执行只用从索引页中就能够取得(如果不是聚集索引,叶子节点存储的是主键+列值,最终还是要回表,也就是要通过主键再查找一次),避免了查到索引后,再做回表操作,减少I/O提高效率。

可以结合第10个问题更容易理解。

9. 什么是前缀索引

前缀索引就是对文本的前几个字符(具体是几个字符在创建索引时指定)创建索引,这样创建起来的索引更小。但是MySQL不能在ORDER BY或GROUP BY中使用前缀索引,也不能把它们用作覆盖索引。

创建前缀索引的语法:

ALTERTABLEtable_name ADD

KEY(column_name(prefix_length))

10. InnoDB 与 MyISAM 索引存储结构的区别

MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。

而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引,所以必须有主键,如果没有显示定义,自动为生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

InnoDB的辅助索引(Secondary Index,也就是非主键索引)存储的只是主键列和索引列,如果主键定义的比较大,其他索引也将很大。

MyISAM引擎使用B+Tree作为索引结构,索引文件叶节点的data域存放的是数据记录的地址,指向数据文件中对应的值,每个节点只有该索引列的值。

MyISAM主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,辅助索引可以重复,(由于MyISAM辅助索引在叶子节点上存储的是数据记录的地址,和主键索引一样,所以不需要再遍历一次主键索引)。

简单的说:

主索引的区别: InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

辅助索引的区别: InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

11. 为什么尽量选择单调递增数值类型的主键

InnoDB中数据记录本身被存于主索引(B+树)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的结点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页。

如果使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引结点的后续位置,当一页写满,就会自动开辟一个新的页,这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。

如果使用非自增主键,由于每次插入主键的值近似于随机,因此每次新纪录都要被插入到现有索引页的中间某个位置,此时MySQL不得不为了将新记录查到合适位置而移动元素,甚至目标页可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过 OPTIMIZE TABLE 来重建表并优化填充页面。

简单的说:

索引树只能定位到某一页,每一页内的插入还是需要通过比较、移动插入的。所以有序主键可以提升插入效率。

12. 建表时,int 后面的长度的意义

int占多少个字节,已经是固定的了,长度代表了显示的最大宽度。如果不够会用0在左边填充,但必须搭配zerofill使用。也就是说,int的长度并不影响数据的存储精度,长度只和显示有关。

13. SHOW INDEX 结果字段代表什么意思

Table:

表名。

Non_unique:

0:该索引不含重复值。

1:该索引可含有重复值。

Key_name:

索引名称,如果是注解索引,名称总是为PRIMARY。

Seq_in_index:

该列在索引中的序号,从 1 开始。例如:存在联合索引 idx_a_b_c (a,b,c),则a的Seq_in_index=1,b=2,c=3。

Column_name:

列名。

Collation:

索引的排列顺序:A(ascending),D (descending),NULL (not sorted)。

Cardinality:

一个衡量该索引的唯一程度的值,可以使用ANALYZE TABLE(INNODB) 或者 myisamchk -a(MyISAM)更新该值。

如果表记录太少,该字段的意义不大。一般情况下,该值越大,索引效率越高。

Sub_part:

对于前缀索引,用于索引的字符个数。如果整个字段都加上了索引,则显示为NULL。

Null:

YES:该列允许NULL值。

'':该列不允许NULL值。

Index_type:

索引类型,包括(BTREE, FULLTEXT, HASH, RTREE)。

如何解决like'%字符串%'时索引失效?

LIKE问题:like 以通配符开头 ('%abc…'),mysql索引失效会变成全表扫描的操作。

罪魁祸首是%,不是LIKE,LIKE 条件是 type = range 级别

%xxx%:全表扫描

%xxx:全表扫描

xxx%:range

解决办法:

使用覆盖索引,可以由 ALL 变为INDEX,为啥呢?覆盖索引之后就能使用使用索引进行全表扫描。这里要注意一下,使用符合索引的时候,命中一个字段就可以,不用全部命中。

15. MySQL高效分页

当然想要实现上述效果的前提是:返回搜狐,查看更多

id是唯一索引,而且单调递增。

N 的值是上一次查询的记录的最后一条id,(需要前端保存一下,不能直接用传统的方法获得)

不支持跨页查询,只能按照第1,2,3,4页这样查询逐页查询。

责任编辑:

mysql数据库索引页号为什么从3开始_MySQL数据库快问快答相关推荐

  1. mysql的索引缺点_「缺点有哪些」数据库索引是什么 有什么优缺点 - seo实验室

    缺点有哪些 数据库索引是什么 数据库索引是:数据库索引就像是一本书的目录一样,使用它可以让你在数据库里搜索查询的速度大大提升.而我们使用索引的目的就是,加快表中的查找和排序.索引的几种类型分别是普通索 ...

  2. mysql中组合索引创建的原则是什么意思_mysql数据库建立组合索引原则

    现实中,mysql可以根据业务需要建立组合索引,由于mysql使用B-Tree格式索引,可以直接定位记录,无需扫描.mysql建立多列索引有最左前缀的原则,即最左优先,如: 如果有一个2列的索引(co ...

  3. 在mysql中能够删除一列的是什么_mysql数据库中命令行下常用命令的操作(增、删、改、查)和数据类型...

    连接命令:mysql -h[主机地址] -u[用户名] -p[用户密码] 创建数据库:create database [库名] 显示所有数据库: show databases; 打开数据库:use [ ...

  4. mysql请输入一个有效类型的长度值_MySQL数据库基础(三)——SQL语言

    MySQL数据库基础(三)--SQL语言 发布时间:2020-05-19 16:40:05 来源:51CTO 阅读:10596 作者:天山老妖S MySQL数据库基础(三)--SQL语言 一.SQL语 ...

  5. mysql 修改自增字段起始值不生效_Mysql数据库基本介绍

    1.mysql不分大小写, 他是存放数据的数据库管理系统字符集使用utf-8,python分大小写,r也分大小写,常用的数据库是关系型数据库,workbench编辑工具,Ctrl+回车执行: 2.一个 ...

  6. mysql数据库中的opt文件是什么文件_MySQL数据库目次下面的db.opt是干什么用的?...

    概述 MySQL数据库存放数据目次里的db.opt文件是MySQL建库进程中主动天生的. 仔细的友人大概会发明有时候在MySQL数据库的某些库目次下有个db.opt文件,那这个文件是干什么用的呢?要是 ...

  7. 快问快答,MySQL面试夺命20问

    数据库架构 说说MySQL 的基础架构图 给面试官讲一下 MySQL 的逻辑架构,有白板可以把下面的图画一下,图片来源于网络. Mysql逻辑架构图主要分三层: (1)第一层负责连接处理,授权认证,安 ...

  8. mysql数据库应用与开发姜桂洪 课后答案_MySQL数据库应用与开发习题解答与上机指导...

    第3部分MySQL数据库模拟试题及参考答案 学习导读: 本部分包括6套MySQL数据库的模拟试题和参考答案,涵盖了本课程的主要知识点,可以帮助读者了解和检验自己的学习情况. 前4套以MySQL基本知识 ...

  9. mysql 存储过程循环一张表的所有记录_MySQL数据库知识汇总

    MySQL是一个开源的关系型数据库,是最受欢迎的开源软件之一,现在很多网站的数据库都是使用MySQL.Web程序开发是Python的一个重要方向,也因此很多企业在招聘Python工程师时都会考察其对M ...

最新文章

  1. 【FFmpeg】降低转码延迟方法、打印信息详解、refcounted_frames详解
  2. SQL Server使用侦听器IP访问时遇到The target principal name is incorrect. Cannot generate SSPI context...
  3. IE下的li有空白问题
  4. java使用:: 表达式_Java 13:切换表达式的增强功能
  5. CentOS 7.6+mysql5.7 设置mysql开机自启动。
  6. Ext.tree.Panel示例
  7. JQuery和JavaScript常用方法的一些区别
  8. 千亿级照片,毫秒间匹配最佳结果,微软开源 Bing 搜索背后的关键算法
  9. [转]Resource for Windows Phone 7
  10. Mac 如何查看电脑的蓝牙版本信息
  11. 亲身经历:2018年深圳保洁员工资时薪75,月薪不清楚
  12. oracle获取字符的长度的函数,oracle取字符串长度的函数length()和hengthb()
  13. Hive3第五章:函数
  14. ionic入门教程第十一课-简要说明ion-list、ion-item完成列表页ion-infinite-scroll上拉加载ion-refresher下拉刷新
  15. 局部敏感哈希(Locality-Sensitive Hashing, LSH)
  16. QT连接MySQL数据库问题
  17. 过滤百度广告+搜索热点+adblock规则快速入门
  18. LoadRunner-登陆web tours订票网站,预订一张机票后退出-1
  19. mysql免安装版用法
  20. 杰里之drc 限幅器、多带限幅器、压缩器、多带压缩器调节【篇】

热门文章

  1. java的sql的like_[Java教程]SQL like 模糊查询, in
  2. excel实战应用案例100讲(一)-用Excel实现表格提交、查询与新建
  3. 初探儿童编程,如何学习编程及幼儿逻辑训练的必要性
  4. pptp mysql 认证_CentOS6.5搭建PPTP+Freeradius整合***管理系统
  5. mysql 超长记录_谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)...
  6. php 映射程序,windows磁盘映射技术分享
  7. 嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中
  8. antd Table/ProList中rowClassName用法(补充记录)
  9. 浅谈一下我了解的PWA
  10. js笔记(五)文档对象模型DOM