你们好,我是小菜,一个渴望在互联网行业作到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚!
死鬼~看完记得给我来个三连哦!
mysql
本文主要介绍 Mysql开发和面试中所必知的
本文较长,分为上下篇(可收藏,勿吃尘)
若有须要,能够参考
若有帮助,不忘 点赞 ❥linux
MySQL是一个关系型数据库管理系统,由瑞典MYSQL AB公司开发,目前属于Oracle公司。
MySQL 是一种关联数据库管理系统,将数据保存在不一样的表中,而不是将全部数据放在一个大仓库中,这样就增长了速度并提升了灵活性。
Mysql是开源的,是能够定制的,采用了GPL协议,你能够修改源码来开发本身的MySQL系统。
MySQL支持大型的数据库。能够处理拥有上千万条记录的大型数据库。MySQL能够容许于多个系统上,而且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
MySQL支持大型数据库,支持5000条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。ios
binlog(二进制日志)
[mysqld]
log-bin = mysql-bin
binlog-format = row
复制代码
Error log(错误日志)
[mysqld]
log-error=/data/mysql_error.log
复制代码
慢查询日志log
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log //linux
long_query_time = 1
复制代码
数据文件
..\mysql-8.0.19-winx64\data
目录下存储数据库文件/var/lib/mysql
(可在配置文件中更改/usr/share/mysql/下的my-huge.cnf)每一个目录表明一个同名的库。配置方式
MysSQL用户管理
权限管理
大小写问题
windows系统默认是大小写不敏感,可是linux系统是大小写敏感的。web
- 0(默认): 大小写敏感
- 1: 大小写不敏感。建立的表,数据库都是以小写形式存放在磁盘中,对于sql语句都是转换为小写对表的DB进行查找。
- 2: 建立的表和DB依据语句上格式存放,凡是查找都是转换为小写进行
SHOW VARIABLES LIKE '%lower_case_table_names%';
复制代码
set lower_case_table_names = 1; #此变量是只读权限,须要在配置文件中修改
复制代码
[mysqld]
lower_case_table_names = 1
复制代码
sql_mode
sql_mode 是个很容易被忽视的变量,默认值是空值,在这种设置下是能够容许一些非法操做的, 好比容许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,因此开发、测试环境的数据库也必需要设置,这样在开发测试阶段就能够发现问题。面试
经常使用设置:算法
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
复制代码
查看引擎
show engines;
复制代码
各引擎简介
sql
事务型引擎
,它被设计用来处理大量的短时间(short-lived)事务。除非有很是特别的缘由须要使用其余的存储引擎,不然应该优先考虑InnoDB引擎。具备行级锁
,外键
,事务
等优点,适合高并发状况
。不支持事务和行级锁(MyISAM改表时会将整个表全锁住)
,缺陷:崩溃后没法安全恢复
。只支持 insert 和 select
操做,在MySQL5.1以前不支持索引。Archive表适合日志和数据采集类引用。适合低访问量大数据等状况
。MyISAM和InnoDB比较
数据库
列
建索引,但并不可能每一列都建索引SQL执行顺序编程
人工读取顺序:
windows
SELECT (DISTINCT)
< select_list >
FROM
< left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition>
ORDER BY
< order_by_condition >
LIMIT < limit_number >
复制代码
引擎执行顺序:
FROM < left_table >
ON < join_condition >
< join_type > JOIN < right_table >
WHERE < where_condition >
GROUP BY < group_by_list >
HAVING < having_condition >
SELECT
(DISTINCT) < select_list >
ORDER BY < order_by_condition >
LIMIT < limit_number >
复制代码
总结:
共有:
知足employee.deptId = dept.id 的数据 称为两表共有独有:
employee.deptId <> dept.id 的数据 称为员工表独有一、
t1 表和 t2 表共有 (inner join)
select * from emp t1 inner join dept t2 on t1.deptId = t2.id
复制代码
二、
t1 表和 t2 表共有 + t1 表独有 (left join)
select * from emp t1 left join dept t2 on t1.deptId = t2.id
复制代码
三、
t1 表和 t2 表共有 + t2表独有(right join)
select * from emp t1 right join dept t2 on t1.deptId = t2.id
复制代码
四、
t1 表的独有(left join…where t2.id is null)
select * from emp t1 left join dept t2 on t1.deptId = t2.id where t2.id is null
复制代码
5.
t2 表的独有(right join…where t1.id is null)
6.
t1 表和 t2 表全有(
union)
select * from emp t1 left join dept t2 on t1.deptId = t2.id
union
select * from emp t1 right join dept t2 on t1.deptid = t2.id
复制代码
七、
t1 表的独有 + t2 表的独有(union)
select * from emp t1 left join dept t2 on t1.deptId = t2.id where t2.id is null
UNION
select * from emp t1 right join dept t2 on t1.deptId = t2.id
where t1.deptId is null
复制代码
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。能够获得索引的本质:索引是数据结构。 目的在于提升查询效率,能够类比字典。
简单理解为 “排好序的快速查找数据结构” :
在数据以外,数据库系统还维护着知足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据。
插入/修改
操做过多时,B-TREE会不断调整平衡,消耗性能。通常来讲索引自己也很大,不可能所有存储在内存中,所以索引每每以索引文件的形式存储在磁盘上。
咱们日常所说的索引,若是没有特别指明,都是指B树 (多路搜索树,并不必定是二叉的)结构组织的索引。其中汇集索引,次要索引,覆盖索引,复合索引,前缀索引,惟一索引默认都是使用B+树这种类型的索引以外,还有哈希索引(hash index)等。
索引优点
索引劣势
索引结构
真实数据存在于叶子节点
,即三、五、九、十、1三、1五、2八、2九、3六、60、7五、7九、90、99.非叶子节点不存储真实的数据,只存储指引搜索方向的数据项
,如1七、35并不真实存在于数据表中。【B+Tree 和 BTree 的区别】
1) 内存有限的状况下,B+Tree永远比BTree好,无限内存则反之
2) B树的关键字和记录是放在一块儿的,叶子节点能够看作外部节点,不包含任何信息;B+树叶子节点中国你只有关键字和指向下一个节点的索引,记录只放在叶子节点中。(一次查询可能进行两次I/O操做)
3) 在B树中,越靠近根节点的记录查找时间越快,只要找到关键字便可肯定记录存在;而B+树每一个记录的查找时间基本是同样的,都须要从根节点走到叶子节点,并且在叶子节点中还要在比较关键字。从这个角度看B树的性能好像会比B+树好,而在实际应用中倒是B+树的性能要好些。由于B+树的非叶子节点不存放实际的数据,这样每一个节点可容纳的元素个数比B数多,树高比B树小,这样带来的好处是减小磁盘访问次数。尽管B+树找到一个记录所需的比较次数比B树多可是一次磁盘访问时间至关于成百上千次内存比较时间,所以实际中B+树的性能可能还会好写,并且B+树的叶子节点使用指针链接在一块儿,方便顺序遍历(例如查看一个目录下的全部文件,一个表中的全部记录等)
4) B+树的磁盘读写代价更低,相对来讲IO读写次数也就下降了。
5) B+树的查询效率更加稳定。因为非终结点并非指向文件内容的节点,而只是叶子节点中关键字的索引。因此任何关键字的查找必须走一条从根节点到叶子节点的路。因此关键字查询的路径长度相同,致使每个数据的查询效率至关。
聚簇索引
好处:
限制:
full-text全文索引
全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它可以利用
分词技术
等多种算法智能分析出文本文字中关键词的频率和重要性,而后按照必定的算法规则智能地筛选出咱们想要的搜索结果。
查询:
# 传统 LIKE 查询
select * from blink t1 where t1.content like '%菜%'
# 全文检索
select * from blink t1 where MATCH(title,content) AGAINST('菜')
复制代码
限制:
MySQL5.6.4以前只用MyISAM 支持,5.6.4之后 InnoDB才支持,可是官方版不支持中文分词,须要第三方分词插件。Hash索引
RTree索引
R-Tree在MySQL不多使用,仅支持geometry 数据结构,支持该类型的存储引擎只有MyISAM、bdb、InnoDB、ndb、archive几种。相对于B-Tree,R-Tree的优点在于查找
。
索引分类
语法:
# 随表一块儿建立
CREATE TABLE emp (
# 使用AUTO_INCREMENT关键字的列必需要有索引
ID int(10) UNSIGNED AUTO_INCREMENT
, NAME varchar(8)
, PRIMARY KEY(ID)
)
# 单独建主键索引
ALTER TABLE emp add PRIMARY KEY emp(id);
# 删除主键索引
ALTER TABLE emp drop PRIMARY KEY; # 修改主键索引前必须删除(drop)原索引,再新建(add)索引
复制代码
语法:
# 随表一块儿建立
CREATE TABLE emp (
# 使用AUTO_INCREMENT关键字的列必需要有索引
ID int(10) UNSIGNED AUTO_INCREMENT
, EMP_NO varchar(8)
, NAME varchar(8)
, KEY(EMP_NO)
)
# 单独建单列索引
create index idx_emp_no on emp(EMP_NO)
# 删除单列索引
drop index idx_emp_no
复制代码
# 随表一块儿建立
CREATE TABLE emp (
# 使用AUTO_INCREMENT关键字的列必需要有索引
ID int(10) UNSIGNED AUTO_INCREMENT
, EMP_NO varchar(8)
, NAME varchar(8)
, UNIQUE(EMP_NO)
)
# 单独建惟一索引
create unique index idx_emp_no on emp(EMP_NO)
# 删除主键索引
drop index idx_emp_no on emp
复制代码
# 随表一块儿建立
CREATE TABLE emp (
# 使用AUTO_INCREMENT关键字的列必需要有索引
ID int(10) UNSIGNED AUTO_INCREMENT
, EMP_NO varchar(8)
, NAME varchar(8)
, key(EMP_NO,NAME)
)
#创建惟一索引是必须保证全部的值是惟一的(除了null),如有重复数据,会报错
# 单独建惟一索引
create index idx_no_name on emp(EMP_NO,NAME)
# 删除主键索引
drop index idx_no_name on emp
复制代码
【基本语法】
# 建立
alter < table_name > add [unique] index <index_name> on <column_name>
# 删除
drop index <index_name> on <table_name>
#查看
show index from <table_name>
#使用ALTER命令
#方式1:该语句添加一个主键,这意味着索引值必须是惟一的,且不能为null
alter table <table_name> add primary key <column_name>
#方式2:该语句添加一个惟一索引,值必须是惟一的(null外,null可能会出现不少次)
alter table <table_name> add unique key <column_name>
#方式3:该语句添加普通索引,索引值能够出现不少次
alter table <table_name> add index <index_name>(column_name)
#方式4:该语句指定了索引为FULLTEXT,用户全文索引
alter table <table_name> add FULLTEXT <index_name>(column_name)
复制代码
哪些状况须要创建索引
哪些状况不须要创建索引
MySQL常见瓶颈
服务器硬件的性能瓶颈:
top,free,iostat和vmstat来查看系统的性能状态
Explain的使用
使用Explain关键字能够模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈
explain + SQL语句
1.【 id】
select查询的序列号,包含一组数字,表示查询中执行select字句或操做表的顺序。
三种状况:
id相同,执行顺序由上至下
id不一样,若是是子查询,id的序号会递增,id值越大优先级越高,越被先执行
id相同和不一样同时存在
id若是相同,能够认为是一组,从上往下顺序执行;在全部组中,id值越大,优先级越高,越先执行。
2.【select_type】
【dependent subquery 和 subquery 的区别】
3.【table】
显示这一行的数据是关于哪张表的4.【type】
type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏的依次排序:
system > const > eq_ef > ref
> range(尽可能保证)
> index > ALL
通常来讲,得保证查询至少达到range级别,最好能达到ref
5.【possible_keys】
显示可能应用到这张表中的索引,一个或多个。查询涉及到的字段上若存在的索引,则该索引将被列出,但不必定被查询实际使用
6.【key】
实际使用的索引,若是为NULL,则没有使用索引。查询中若使用了覆盖索引,则该索引和查询的select字段重叠。
7.【key_len】
表示索引中使用的字节数,可经过该列计算查询中使用的索引的长度。key_len字段可以帮你检查是否充分利用上了索引。
8.【ref】
9.【row】
10.【Extra】
覆盖索引:
索引的使用
10.少用or,用它链接时索引会失效
【例子小节】
此时复合索引index(a,b,c)
【使用建议】
关联查询优化
# 未加索引,type为ALL
explain select * from class left join book on class.card = book.card
# 添加索引优化,第二行的type变成了ref
alter table book add index idx_card_B(card);
# 这是由左链接特效决定的,left join条件用于肯定如何从右表搜索行,左边必定都有
# 继续优化,删除旧索引,新建新索引
drop index idx_card_B on book;
alter table class add index idx_card_A(card)
复制代码
子查询优化
order by关键字优化
例子:talA 表中有索引 (age,birth,name)
分页查询的优化--limit
explain select sql_no_chache * from emp order by deptno limit 10000,40
复制代码
#加上索引
create index emp on emp(deptno)
复制代码
# 经过以上结果能够看出加上索引并不能改变
# 进一步优化:先利用覆盖索引把要取的数据行的主键取到,而后再用这个主键列与数据表作关联(查询数据量小了后)
explain select sql_no_cache * from emp e inner join (select id from emp e order by deptno limit 10000,40)a on a.id = e.id
复制代码
GROUP BY 关键字优化
去重优化
例子:
# 使用distinct关键字去重消耗性能
select distinct BOOK_NAME from book where id in(1,2,5,4,8)
# 使用 group by可以利用到索引
select BOOK_NAME from book where id in(1,2,5,4,8) group by BOOK_NAME
复制代码
本文较长,能看到这里的都是最棒的!成长之路学无止境~
今天的你多努力一点,明天的你就能少说一句求人的话!好久好久以前,有个传说,听说:
看完不赞,都是坏蛋