数据库是 “按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
比如看建表的语法:
mysql> ? create table
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,…)
[table_options]
[partition_options]
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,…)]
[table_options]
[partition_options]
[IGNORE | REPLACE]
[AS] query_expression
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
MyISAM、 InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、 ARCHIVE、CSV、BLACKHOLE、FEDERATED。
Tips:InnoDB 和 BDB 提供事务安全表,其他存储引擎都是非事务安全表。
1.Myisam 是 Mysql 的默认存储引擎,当 create 创建新表时,未指定新表的存储引擎时,默认使用 Myisam。
每个 MyISAM 在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是 .frm (存储表定义) 、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。
数据文件和索引文件可以放置在不同的目录,平均分布 io,获得更快的速度。
2.InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比 Myisam 的存储引擎,InnoDB 写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
可以,ENGINE=xxx 设置引擎。
代码示例:
create table person(
id int primary key auto_increment,
username varchar(32)
) ENGINE=InnoDB
选择标准:根据应用特点选择合适的存储引擎,对于复杂的应用系统可以根据实际情况选择 多种存储引擎进行组合.
下面是常用存储引擎的适用环境:
前提:使用适合存储引擎。
选择原则:根据选定的存储引擎,确定如何选择合适的数据类型下面的选择方法按存储引擎分类 :
保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
mysql 服务器可以支持多种字符集 (可以用 show character set 命令查看所有 mysql 支持 的字符集) ,在同一台服务器、同一个数据库、甚至同一个表的不同字段都可以指定使用不 同的字符集。
mysql 的字符集包括字符集 (CHARACTER) 和校对规则 (COLLATION) 两个概念。
建议在能够完全满足应用的前提下,尽量使用小的字符集。因为更小的字符集意味着能够节省空间、 减少网络传输字节数,同时由于存储空间的较小间接的提高了系统的性能。
有很多字符集可以保存汉字,比如 utf8、gb2312、gbk、latin1 等等,但是常用的是 gb2312 和 gbk。因为 gb2312 字库比 gbk 字库小,有些偏僻字 (例如:洺) 不能保存,因此 在选择字符集的时候一定要权衡这些偏僻字在应用出现的几率以及造成的影响, 不能做出肯 定答复的话最好选用 gbk。
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
1、聚集索引(clustered index)
2、非聚集索引(non-clustered index)
hash 索引底层就是 hash 表,进行查询时,调用一次 hash 函数就可以获取到相应的键值,之后进行回表查询获得实际数据.
B + 树底层实现原理是多路平衡查找树,对于每一次的查询都是从根节点出发,查询到叶子节点方可以获得所查键值,然后查询判断是否需要回表查询.
区别:
hash 索引
1:hash 索引进行等值查询更快 (一般情况下) 但是却无法进行范围查询。因为在 hash 索引中经过 hash 函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.
2:hash 索引不支持模糊查询以及多列索引的最左前缀匹配,因为 hash 函数的不可预测,eg:AAAA 和 AAAAB 的索引没有相关性.
3:hash 索引任何时候都避免不了回表查询数据.
4:hash 索引虽然在等值上查询叫快,但是不稳定,性能不可预测,当某个键值存在大量重复的时候,发生 hash 碰撞,此时查询效率可能极差.
5:hash 索引不支持使用索引进行排序,因为 hash 函数的不可预测.
B + 树
1:B + 树的所有节点皆遵循 (左节点小于父节点,右节点大于父节点,多叉树也类似) 自然支持范围查询.
2: 在符合某些条件 (聚簇索引,覆盖索引等) 的时候可以只通过索引完成查询。不需要回表查询.
3: 查询效率比较稳定,对于查询都是从根节点到叶子节点,且树的高度较低.
结论
大多数情况下,直接选择 B + 树索引可以获得稳定且较好的查询速度,而不需要使用 Hash 索引.
链接:https://blog.csdn.net/qq_44590469/article/details/97877397
不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询.
举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行 select age from employee where age < 20
的查询时,在索引的叶子节点上,已经包含了 age 信息,不会再次进行回表查询.
select * from table_name order by id desc limit 1;
原因:用户传入的参数中注入符合 sql 的语法,从而破坏原有 sql 结构语意,达到攻击效果。
NULL 值是没有值,,它不是空串。如果指定’’(两个单引号,其间没有字符),这在 NOT NULL 列中是允许的。空串是一个有效的值,它不是无值。
判断 NULL 需要用 IS NULL 或者 IS NOT NULL。
可以用来维护数据库的完整性,它保证成批的 MySQL 操作要么完全执行,要么完全不执行。
事务是必须满足 4 个条件(ACID):
可重复读(REPEATABLE-READ)
查看:
mysql> select @@global.tx_isolation;
+———————————+
| @@global.tx_isolation |
+———————————+
| REPEATABLE-READ |
+———————————+
1 row in set, 1 warning (0.01 sec)
数据库的锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性,这样才能保证在高并发的情况下,访问数据库的时候,数据不会出现问题。
是指两个或两个以上进程执行过程中,因竞争共享资源造成的相互等待现象。
创建用户:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
授权:
GRANT privileges ON databasename.tablename TO 'username'@'host';
desc table_name;
mysql> desc zipkin_spans;
+———————+———————+———+——+————+———+
| Field | Type | Null | Key | Default | Extra |
+———————+———————+———+——+————+———+
| trace_id_high | bigint(20) | NO | PRI | 0 | |
| trace_id | bigint(20) | NO | PRI | NULL | |
| id | bigint(20) | NO | PRI | NULL | |
| name | varchar(255) | NO | MUL | NULL | |
| parent_id | bigint(20) | YES | | NULL | |
| debug | bit(1) | YES | | NULL | |
| start_ts | bigint(20) | YES | MUL | NULL | |
| duration | bigint(20) | YES | | NULL | |
+———————+———————+———+——+————+———+
8 rows in set (0.01 sec)
1.delete : 仅删除表数据,支持条件过滤,支持回滚。记录日志。因此比较慢。
delete from table_name;
2.truncate: 仅删除所有数据,不支持条件过滤,不支持回滚。不记录日志,效率高于 delete。
truncate table table_name;
3.drop: 删除表数据同时删除表结构。将表所占的空间都释放掉。删除效率最高。
drop table table_name;
Xxx% 走索引, % xxx 不走索引。
在普通索引查到主键索引后,再去主键索引定位记录。等于说非主键索引需要多走一个索引树。
索引覆盖被查询的字段。
如果一个索引包含 (或覆盖) 所有需要查询的字段的值,称为‘覆盖索引’。
优点
简单化,数据所见即所得
安全性,用户只能查询或修改他们所能见到得到的数据
逻辑独立性,可以屏蔽真实表结构变化带来的影响
缺点
性能相对较差,简单的查询也会变得稍显复杂
修改不方便,特变是复杂的聚合视图基本无法修改
本质区别,主键是一种约束,唯一索引是一种索引。
主键不能有空值(非空 + 唯一),唯一索引可以为空。
主键可以是其他表的外键,唯一索引不可以。
一个表只能有一个主键,唯一索引 可以多个。
都可以建立联合主键或联合唯一索引。
主键 -》聚簇索引,唯一索引 -> 非聚簇索引。
SELECT * FROM table_name ORDER BY rand() LIMIT 1;
show index from table_name;
MVCC 全称是多版本并发控制系统,InnoDB 的 MVCC 是通过在每行记录后面保存两个隐藏的列来实现,这两个列一个保存了行的创建时间,一个保存行的过期时间(删除时间)。当然存储的并不是真实的时间而是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动新增,事务开始时刻的系统版本号会作为事务的版本号,用来查询到每行记录的版本号进行比较。
客户端连接数据库,验证身份。
获取当前用户权限。
当你查询时,会先去缓存看看,如果有返回。
如果没有,分析器对 sql 做词法分析。
优化器对 sql 进行 “它认为比较好的优化”。
执行器负责具体执行 sql 语句。
最后把数据返回给客户端。
explain sql;
一、 id
SQL 查询中的序列号。
id 列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行。
二、select_type
三、table
显示这一行的数据是关于哪张表的。不一定是实际存在的表名。
可以为如下的值:
四、type
这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型依次为:
system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL
1、system
表中只有一行数据或者是空表,这是 const 类型的一个特例。且只能用于 myisam 和 memory 表。如果是 Innodb 引擎表,type 列在这个情况通常都是 all 或者 index
2、const
最多只有一行记录匹配。当联合主键或唯一索引的所有字段跟常量值比较时,join 类型为 const。其他数据库也叫做唯一索引扫描
3、eq_ref
多表 join 时,对于来自前面表的每一行,在当前表中只能找到一行。这可能是除了 system 和 const 之外最好的类型。当主键或唯一非 NULL 索引的所有字段都被用作 join 联接时会使用此类型。
eq_ref 可用于使用’=' 操作符作比较的索引列。比较的值可以是常量,也可以是使用在此表之前读取的表的列的表达式。
相对于下面的 ref 区别就是它使用的唯一索引,即主键或唯一索引,而 ref 使用的是非唯一索引或者普通索引。
eq_ref 只能找到一行,而 ref 能找到多行。
4、ref
对于来自前面表的每一行,在此表的索引中可以匹配到多行。若联接只用到索引的最左前缀或索引不是主键或唯一索引时,使用 ref 类型(也就是说,此联接能够匹配多行记录)。
ref 可用于使用’=‘或’<=>' 操作符作比较的索引列。
5、 fulltext
使用全文索引的时候是这个类型。要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql 不管代价,优先选择使用全文索引
6、ref_or_null
跟 ref 类型类似,只是增加了 null 值的比较。实际用的不多。
7、index_merge
表示查询使用了两个以上的索引,最后取交集或者并集,常见 and ,or 的条件使用了不同的索引,官方排序这个在 ref_or_null 之后,但是实际上由于要读取多个索引,性能可能大部分时间都不如 range
8、unique_subquery
用于 where 中的 in 形式子查询,子查询返回不重复值唯一值,可以完全替换子查询,效率更高。
该类型替换了下面形式的 IN 子查询的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)
9、index_subquery
该联接类型类似于 unique_subquery。适用于非唯一索引,可以返回重复值。
10、range
索引范围查询,常见于使用 =, <>,>, >=, <, <=, IS NULL, <=>, BETWEEN, IN () 或者 like 等运算符的查询中。
11、index
索引全表扫描,把索引从头到尾扫一遍。这里包含两种情况:
一种是查询使用了覆盖索引,那么它只需要扫描索引就可以获得数据,这个效率要比全表扫描要快,因为索引通常比数据表小,而且还能避免二次查询。在 extra 中显示 Using index,反之,如果在索引上进行全表扫描,没有 Using index 的提示。
12、all
全表扫描,性能最差。
五、possible_keys
查询可能使用到的索引都会在这里列出来。
六、Key
key 列显示 MySQL 实际使用的键(索引)
要想强制 MySQL 使用或忽视 possible_keys 列中的索引,可以使用 FORCE INDEX、USE INDEX 或者 IGNORE INDEX。
select_type 为 index_merge 时,这里可能出现两个以上的索引,其他的 select_type 这里只会出现一个。
七、key_len
表示索引中使用的字节数。
key_len 只计算 where 条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到 key_len 中。
不损失精确性的情况下,长度越短越好 。
八、ref
表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
九、rows
rows 也是一个重要的字段。 这是 mysql 估算的需要扫描的行数(不是精确值)。
十、Extra
该列包含 MySQL 解决查询的详细信息,有以下几种情况:
链接:https://www.jianshu.com/p/8fab76bbf448
16
主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的 ID 列作为主键。设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全.
MySQL 官网这样介绍:
NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables, each NULL columntakes one bit extra, rounded up to the nearest byte.
null 值会占用更多的字节,且会在程序中造成很多与预期不符的情况.
varchar 的 10 代表了申请的空间长度,也是可以存储的数据的最大长度,而 int 的 10 只是代表了展示的长度,不足 10 位以 0 填充。也就是说,int (1) 和 int (10) 所能存储的数字大小以及占用的空间都是相同的,只是在展示时按照长度展示。
视图 (View) 是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并 不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时 动态生成的。
视图相对于普通的表的优势主要包括以下几项。
MyISAM : 把一个表的总行数存在了磁盘上,执行 count (*) 的时候会直接返回这个数,效率很高。
InnoDB : 比较麻烦,它执行 count (*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。
参考:
1.1 MySQL 面试题(基础部分):
1.2 MySQL 面试题(实战部分):
1.3 MySQL 面试题(高级进阶部分):
MySQL 面试答案与解析:
2.1 MySQL 性能优化的 21 个最佳实践
2.2 MySQL 性能调优与架构设计 —— 全册
MySQLI 基本介绍、MySQL 架构组成、MySQL 存储引擎简介、MySQL 安全管理、MySQL 备份与恢复
影响 MySQLServer 性能的相关因素、MySQI 数据库锁定机制、MySQL 数据库 Query 的优化、MySQL 数据库 Schema 设计的性能优化、MySQLServer 性能优化、常用存储引擎优化
MySQL 可扩展设计的基本原则、可扩展性设计之 MySQLReplication、可扩展性设计之数据切分、可扩展性设计之 C ache 与 Se ar ch 的利用、MySQLCluster、高可用设计之思路及方案、高可用设计之 MySQL 监控
2.3 MySQL 从入门到项目实践
Hello MySQL、数据库初探、MySQL 常用管理工具的使用、MySQL 数据库的基本操作
数据表的基本操作、MySQL 视图、MySQL 的数据类型和运算符、MySQL 函数、MySQL 数据库查询语句详解、MySQL 数据库的数据与索引操作、存储过程与存储函数、使用 MySQL 触发器
MySQL 数据库的权限管理与恢复、MySQL 数据库的复制、MySQL 的日志管理、利用 MySQL 构建分布式应用、MySQL 查询缓存、MySQL 错误代码和消息的使用
在 C# 中实现 MySQL 数据库的连接、在 Java 中实现 MySQL 数据库的连接、在 PHP 中实现 MySQL 数据库的连接
项目实战统筹阶段 —— 项目开发与规划、项目实战入门阶段 —— 论坛管理系统数据库开发、项目实战提高阶段 —— 企业会员管理系统数据库开发、项目实战高级阶段 —— 新闻发布系统数据库开发
MySQL 优化问题(Xmind)
事务、锁、sql 优化原则、JION 的原理、执行计划与执行明细、执行流程、表结构对性能的影响、索引
总而言之,学习是自己的事,作为开发人员,MySQL 是必须要掌握的,如果拥有大厂梦,基础可不能太差,如果你对 MySQL 还有很多不解问题,那么这份 MySQL 总结大礼包一定要拥有!
由于篇幅有限以上答案博主已经整理好了,需要的同学可以点赞,私信博主“资料”即可免费获取