Code Monkey home page Code Monkey logo

mysql-notes's Introduction

MySQL 学习笔记Alpha

D瓜哥的 MySQL 学习笔记。

Github 对 Asciidoctor 的支持不是特别完善,另外很多人可能没有处理 Asciidoc 的工具。所以,D瓜哥把该文档处理后发布出来了。查看该文档内容请看下面官网。

该笔记官网: https://notes.diguage.com/mysql/

该笔记尚未完成,后续还会持续增加新内容。敬请关注!

文档来源

本文档可以看作是 D瓜哥 学习《高性能MySQL》时,做的读书笔记。为了让内容更丰富易懂,还参考了《MySQL技术内幕》和《数据库索引设计与优化》。

本文档暂时只关注开发人员眼中的 MySQL。所以,内容暂时只覆盖数据库设计、索引及其数据结构和查询优化三块内容。其他内容视情况再做补充。

友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

微信公众号:jikerizhi
Figure 1. 微信公众号:jikerizhi
💡
公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

亟需完善的内容

  1. 事务的实现原理 — OK

  2. 分形树(抱歉,我还没搞懂)

  3. 索引优化实践

  4. 索引优化实际案例分析

  5. 分布式数据库

    1. 分库分表

    2. NewSQL

    3. 分布式事务

免责声明

本文档绝大部分内容是针对 MySQL 5.5 的,随着 MySQL 的发展,部分的内容可能会过时。所以,如有错误之处,还请以相应版本的官方文档为准!

本文档部分的内容可能会过时!

本文档部分的内容可能会过时!

本文档部分的内容可能会过时!

参考使用时,还请格外注意!

由于本文档造成的任何问题以及损失,D瓜哥本人概不负责!

参考书籍

更多参考资料,请查看文档最末尾的“参考资料”章节。这里只列出最重要的参考书籍。

mysql-notes's People

Contributors

diguage avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mysql-notes's Issues

这个 SQL 如何优化?

select id,
       uuid,
       billId,
       -- 各种字段
from bill_rule
where uuid= '1'
  and billId = (select billId
                from bill_rule
                where uuid= '1'
                  and billStatus = 1
                order by billDate desc
                limit 0,1);

常用命令

-- 查看数据库字符集
USE db_name;
SELECT @@character_set_database, @@collation_database;
show variables like 'character_set_database';
show variables like 'collation_database';


SHOW CREATE DATABASE "schemaName";

-- 查看数据库字符集
-- https://stackoverflow.com/a/1049958/951836
SELECT schema_name,
       default_character_set_name,
       DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA;

-- 查看表字符集
SELECT t.table_name, ccsa.character_set_name
FROM information_schema.`TABLES` t,
     information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` ccsa
WHERE ccsa.collation_name = t.table_collation
  AND t.table_schema = "schemaName";

-- 查看字段字符集
SELECT column_name, character_set_name
FROM information_schema.`COLUMNS`
WHERE table_schema = "schemaName"
  AND table_name = "tableName";

-- 查看当前 Schema 中特定类型字段字符集
-- https://stackoverflow.com/a/4805964/951836
SELECT TABLE_SCHEMA,
       TABLE_NAME,
       ccsa.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME,
       COLUMN_TYPE,
       c.CHARACTER_SET_NAME
FROM information_schema.TABLES AS T
         JOIN information_schema.COLUMNS AS c USING (TABLE_SCHEMA, TABLE_NAME)
         JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS ccsa
              ON (T.TABLE_COLLATION = ccsa.COLLATION_NAME)
WHERE TABLE_SCHEMA = SCHEMA()
  AND c.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext')
ORDER BY TABLE_SCHEMA,
         TABLE_NAME,
         COLUMN_NAME;

-- https://stackoverflow.com/a/38996782/951836
SHOW FULL COLUMNS FROM my_tablename;

-- 查看默认字符集
SHOW VARIABLES LIKE 'character%';

-- 查询支持的中日韩字符集
-- https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/faqs-cjk.html
SELECT CHARACTER_SET_NAME, DESCRIPTION
FROM INFORMATION_SCHEMA.CHARACTER_SETS
WHERE DESCRIPTION LIKE '%Chin%'
   OR DESCRIPTION LIKE '%Japanese%'
   OR DESCRIPTION LIKE '%Korean%'
ORDER BY CHARACTER_SET_NAME;

-- 查看默认存储引擎
SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+

-- 查看 InnoDB 的运行状态
-- https://mariadb.com/kb/en/show-engine-innodb-status/
SHOW ENGINE INNODB STATUS;

《MySQL 是怎样运行的》笔记

== ch01

image

从 MySQL 5.7.20 开始,不推荐使用查询缓存,在 MySQL 8.0 中直接删除了查询缓存。

server 层与存储引擎层交互时,一般是以记录为单位的。

server 层在判断记录符合条件后,先将其发送到一个缓存区,待缓存区满之后,才向客户端发送真正的记录,可以通过 net_buffer_length 控制缓存区大小。

InNoDB 从 MySQL 5.5.5 开始作为 MySQL 的默认存储引擎。

-- 显示支持引擎类型
SHOW ENGINES;

-- 指定表的引擎类型
CREATE TABLE `engine_memory`
(
    `i` INT DEFAULT NULL
) ENGINE = MEMORY;

-- 修改引擎类型
ALTER TABLE engine_memory
    ENGINE = InnoDB;

== ch02

=== 启动选项

命令行指定时,等号两边不能有空格;配置文件中指定时,可以有空格。可以通过 mysqld --verbose --help 查看支持的启动选项。

[source]

[server]
default-storage-engine=InnoDB

配置文件分组支持:

  • mysqld
  • mysqld_safe
  • mysql.server
  • mysql
  • mysqladmin
  • mysqldump
  • server
  • client

前几个几乎都是指定到命令行程序,后两个是针对客户端程程序(mysqlmysqladmin, mysqldump)。另外,由于服务端启动,都是通过调用 mysqld 来启动数据库。所以,mysqld 的配置也会被其他两种启动方式继承。

还可以通过在分组后面加版本号的方式来给指定版本添加配置项:

[source]

[server-5.7]
default-storage-engine=InnoDB

=== 系统变量

[source,sql]

SHOW VARIABLES [LIKE <匹配模式>];

SHOW VARIABLES LIKE 'default%';

-- 设置系统变量
SET [GLOBAL|SESSION] 系统变量名 = 值;

SET [@@(GLOBAL|SESSION)] 系统变量名 = 值;
-- 不加 GLOBAL,默认作用范围就是 SESSION。

-- 查看指定范围的系统变量;不传 GLOBAL,则默认是 SESSION。
SHOW [GLOBAL|SESSION] VARIABLES [LIKE <匹配模式>];

在配置文件中,系统变量的单词之间必须用 _ 连接起来。大部分系统变量也是启动选项。

=== 状态变量

状态变量是用来显示服务器程序运行状态的。

[source,sql]

-- 查看状态变量;不传 GLOBAL,则默认是 SESSION。
SHOW [GLOBAL|SESSION] STATUS [LIKE <匹配模式>];

== ch03 字符集

[source,sql]

-- 查看支持的字符集
SHOW (CHARACTER SET|CHARSET) [LIKE <匹配模式>];

utf8mb4 从 MySQL 8.0 开始作为其默认字符集。

[source,sql]

-- 查看支持的排序规则
SHOW COLLATION [LIKE <匹配模式>];

. 字符集名称
. 应用语言
. 是否区分重音、大小写等

字符集及排序

简单一句话总结: MySQL 8.0 支持新的排序规则 utf8mb4_0900_ai_ci,优先考虑使用这个规则。

  1. New collations in MySQL 8.0.0 | MySQL Server Blog
  2. MySQL 8.0 Collations: The devil is in the details. | MySQL Server Blog
  3. An in depth DBA's guide to migrating a MySQL database from the utf8 to the utf8mb4 charset – Saverio Miroddi – 64K RAM SYSTEM  38911 BASIC BYTES FREE -- 这篇文章值得好好读一读。
  4. MySQL :: MySQL 5.7 Reference Manual :: 10.4 Connection Character Sets and Collations
  • The default collation for utf8mb4 differs between MySQL 5.7 and 8.0 (utf8mb4_general_ci for 5.7, utf8mb4_0900_ai_ci for 8.0).
  • When the 8.0 client requests a character set of utf8mb4, what it sends to the server is the default 8.0 utf8mb4 collation; that is, the utf8mb4_0900_ai_ci.
  • utf8mb4_0900_ai_ci is implemented only as of MySQL 8.0, so the 5.7 server does not recognize it.
  • Because the 5.7 server does not recognize utf8mb4_0900_ai_ci, it cannot satisfy the client character set request, and falls back to its default character set and collation (latin1 and latin1_swedish_ci).
-- 查看数据库字符集
USE db_name;
SELECT @@character_set_database, @@collation_database;
show variables like 'character_set_database';
show variables like 'collation_database';


SHOW CREATE DATABASE "schemaName";

-- 查看数据库字符集
-- https://stackoverflow.com/a/1049958/951836
SELECT schema_name,
       default_character_set_name,
       DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA;

-- 查看表字符集
SELECT t.table_name, ccsa.character_set_name
FROM information_schema.`TABLES` t,
     information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` ccsa
WHERE ccsa.collation_name = t.table_collation
  AND t.table_schema = "schemaName";

-- 查看字段字符集
SELECT column_name, character_set_name
FROM information_schema.`COLUMNS`
WHERE table_schema = "schemaName"
  AND table_name = "tableName";

-- 查看当前 Schema 中特定类型字段字符集
-- https://stackoverflow.com/a/4805964/951836
SELECT TABLE_SCHEMA,
       TABLE_NAME,
       ccsa.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME,
       COLUMN_TYPE,
       c.CHARACTER_SET_NAME
FROM information_schema.TABLES AS T
         JOIN information_schema.COLUMNS AS c USING (TABLE_SCHEMA, TABLE_NAME)
         JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS ccsa
              ON (T.TABLE_COLLATION = ccsa.COLLATION_NAME)
WHERE TABLE_SCHEMA = SCHEMA()
  AND c.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext')
ORDER BY TABLE_SCHEMA,
         TABLE_NAME,
         COLUMN_NAME;

-- https://stackoverflow.com/a/38996782/951836
SHOW FULL COLUMNS FROM my_tablename;

-- 查看默认字符集
SHOW VARIABLES LIKE 'character%';

-- 查询支持的中日韩字符集
-- https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/faqs-cjk.html
SELECT CHARACTER_SET_NAME, DESCRIPTION
FROM INFORMATION_SCHEMA.CHARACTER_SETS
WHERE DESCRIPTION LIKE '%Chin%'
   OR DESCRIPTION LIKE '%Japanese%'
   OR DESCRIPTION LIKE '%Korean%'
ORDER BY CHARACTER_SET_NAME;

-- 查看默认存储引擎
SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+

-- 查看 InnoDB 的运行状态
-- https://mariadb.com/kb/en/show-engine-innodb-status/
SHOW ENGINE INNODB STATUS;

查询时间

-- 当前日期
SELECT CURDATE();

-- 当前日期+时间
SELECT NOW();

-- 明天
SELECT ADDDATE(CURDATE(), 1);

-- 昨天
SELECT SUBDATE(CURDATE(), 1);

-- 上周
SELECT SUBDATE(CURDATE(), 7), SUBDATE(CURDATE(), 1);

-- 下周
SELECT ADDDATE(CURDATE(), 1), ADDDATE(CURDATE(), 7);

-- 当周第一天即星期一
SELECT DATE(CURDATE() - INTERVAL WEEKDAY(CURDATE()) DAY);
--
SELECT SUBDATE(CURDATE(), WEEKDAY(CURDATE()));

-- 当周最后一天即星期天
SELECT ADDDATE(CURDATE(), (6 - WEEKDAY(CURDATE())));

-- 当前周的序号
SELECT WEEK(CURDATE());

-- 当天在当周的序号
SELECT WEEKDAY(CURDATE());

-- 上周第一天即星期一
SELECT DATE(CURDATE() - INTERVAL WEEKDAY(CURDATE()) DAY - INTERVAL 1 WEEK);
--
SELECT SUBDATE(CURDATE(), WEEKDAY(CURDATE()) + 7);

-- 上周最后一天即星期天
SELECT ADDDATE(CURDATE(), -1 - WEEKDAY(CURDATE()));

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.