大数据技术之_29_MySQL 高级面试重点串讲_01_存储引擎 + Join 查询 + 索引与数据处理 + 查看执行计划 -- Explain + 索引失效(应该避免) + 批量数据脚本

本文主要是介绍大数据技术之_29_MySQL 高级面试重点串讲_01_存储引擎 + Join 查询 + 索引与数据处理 + 查看执行计划 -- Explain + 索引失效(应该避免) + 批量数据脚本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大数据技术之_29_MySQL 高級面试重点串讲_01

    • 第1章 存储引擎
      • 1.1 Mysql 逻辑架构介绍
      • 1.2 查看命令
      • 1.3 MyISAM 和 InnoDB 的对比
      • 1.4 阿里巴巴、淘宝用哪个
    • 第2章 Join 查询
      • 2.1 SQL 执行顺序(一般情况下)
        • 2.1.1 手写顺序
        • 2.1.2 机读顺序
        • 2.1.3 总结
      • 2.2 建表 SQL
      • 2.3 7 种 JOIN 图
      • 2.4 7 种 JOIN 实操
    • 第3章 索引与数据处理
      • 3.1 索引是什么
        • 3.1.1 索引的优势
        • 3.1.2 索引的劣势
      • 3.2 索引分类
      • 3.3 查看执行计划 -- Explain
        • 3.3.1 Explain 是什么
        • 3.3.2 Explain 能干嘛
        • 3.3.3 Explain 怎么玩
        • 3.3.4 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 批量数据脚本
        • 3.6.1 建表
        • 3.6.2 设置一个参数 log_bin_trust_function_creators
        • 3.6.3 创建函数,保证每条数据都不同
        • 3.6.4 创建存储过程
        • 3.6.5 调用存储过程

天上飞的理念必有落地的实现。

第1章 存储引擎

1.1 Mysql 逻辑架构介绍

  和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

1、连接层
  最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于 SSL 的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

2、服务层
  第二层架构主要完成大多数的核心服务功能,如 SQL 接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是 select 语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。

3、引擎层
  存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面主要介绍 MyISAMInnoDB

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

这篇关于大数据技术之_29_MySQL 高级面试重点串讲_01_存储引擎 + Join 查询 + 索引与数据处理 + 查看执行计划 -- Explain + 索引失效(应该避免) + 批量数据脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100772

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分