大数据技术之_29_MySQL 高級面试重点串讲_01
-
- 第1章 存储引擎
- 第2章 Join 查询
- 第3章 索引与数据处理
-
- 3.1 索引是什么
- 3.2 索引分类
- 3.3 查看执行计划 -- Explain
- 3.4 小案例
- 3.5 索引失效(应该避免)
-
- 3.5.1 全值匹配我最爱(数量和顺序全匹配)
- 3.5.2 最佳左前缀法则
- 3.5.3 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
- 3.5.4 存储引擎不能使用索引中范围条件右边的列
- 3.5.5 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),select * 尽量少用
- 3.5.6 mysql 在使用不等于(!= 或者<>)的时候,可能无法使用索引会导致全表扫描
- 3.5.7 注意 null/not null 对索引的可能影响,要看该字段是否定义为空
- 3.5.8 like 以通配符开头('%abc...'),mysql 索引失效会变成全表扫描的操作
- 3.5.9 字符串不加单引号索引失效
- 3.5.10 少用 or,用它来连接时,索引可能会失效
- 3.5.11 小总结
- 3.6 批量数据脚本
天上飞的理念必有落地的实现。
第1章 存储引擎
1.1 Mysql 逻辑架构介绍
和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构
上,插件式的存储引擎架构
将查询处理和其它的系统任务以及数据的存储提取相分离
。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
1、连接层
最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于 SSL 的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
2、服务层
第二层架构主要完成大多数的核心服务功能,如 SQL 接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是 select 语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
3、引擎层
存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面主要介绍 MyISAM
和 InnoDB
。
4、存储层
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
1.2 查看命令
如何用命令查看
#登录客户端
[atguigu@hadoop102 ~]$ mysql -uroot -p
#看你的 mysql 中的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| commerce |
| company |
| db_telecom |
| metastore |
| mysql |
| oozie |
| performance_schema |
| rdd |
| report |
| test |
+--------------------+
#看你的 mysql 的版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.24 |
+-----------+
#创建数据库
mysql> create database db0508;
Query OK, 1 row affected (0.00 sec)
#使用数据库
mysql> use db0508;
Database changed
#看你的 mysql 的版本
#看你的 mysql 现在已提供什么存储引擎:
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
#看你的 mysql 当前默认的存储引擎:
mysql> show variables like '%storage_engine%';
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| storage_engine | InnoDB |
+----------------------------+--------+
1.3 MyISAM 和 InnoDB 的对比
1.4 阿里巴巴、淘宝用哪个
1、Percona 为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有着很显著的提升。该版本提升了在高负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。
2、该公司新建了一款存储引擎叫 xtradb 完全可以替代 innodb,并且在性能和并发上做得更好。
3、阿里巴巴大部分 mysql 数据库其实使用的 percona 的原型加以修改。
4、AliSql + AliRedis
第2章 Join 查询
2.1 SQL 执行顺序(一般情况下)
2.1.1 手写顺序
2.1.2 机读顺序
2.1.3 总结
2.2 建表 SQL
CREATE TABLE `tbl_dept` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`locAdd` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `tbl_emp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_dept_id` (`deptId`)
#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `tbl_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO tbl_dept (deptName, locAdd) VALUES ('RD', 11);
INSERT INTO tbl_dept (deptName, locAdd) VALUES ('HR', 12);
INSERT INTO tbl_dept (deptName, locAdd) VALUES ('MK', 13);
INSERT INTO tbl_dept (deptName, locAdd) VALUES ('MIS', 14);
INSERT INTO tbl_dept (deptName, locAdd) VALUES ('FD', 15);
INSERT INTO tbl_emp (NAME, deptId) VALUES ('z3', 1);
INSERT INTO tbl_emp (NAME, deptId) VALUES ('z4', 1);
INSERT INTO tbl_emp (NAME, deptId) VALUES ('z5', 1);
INSERT INTO tbl_emp (NAME, deptId) VALUES ('w5', 2);
INSERT INTO tbl_emp (NAME, deptId) VALUES ('w6', 2);
INSERT INTO tbl_emp (NAME, deptId) VALUES ('s7', 3);
INSERT INTO tbl_emp (NAME, deptId) VALUES ('s8', 4);
INSERT INTO tbl_emp (NAME, deptId) VALUES ('s9', 51);
2.3 7 种 JOIN 图
2.4 7 种 JOIN 实操
0:原始数据
mysql> select * from tbl_emp;
+----+------+--------+
| id | name | deptId |
+----+------+--------+
| 1 | z3 | 1 |
| 2 | z4 | 1 |
| 3 | z5 | 1 |
| 4 | w5 | 2 |
| 5 | w6 | 2 |
| 6 | s7 | 3 |
| 7 | s8 | 4 |
| 8 | s9 | 51 |
+----+------+--------+
8 rows in set (0.00 sec)
mysql> select * from tbl_dept;
+----+----------+--------+
| id | deptName | locAdd |
+----+----------+--------+
| 1 | RD | 11 |
| 2 | HR | 12 |
| 3 | MK | 13 |
| 4 | MIS | 14 |
| 5 | FD | 15 |
+----+----------+--------+
5 rows in set (0.00 sec)
1:A、B 两表共有
mysql> select * from tbl_emp a inner join tbl_dept b on a