MySQL-JOIN优化
参考文献
MySQL技术内幕 SQL编程 姜承尧
JOIN算法
当联接的表上有索引,Nestd-Loops Join是非常高效的算法.根据B+树的特性,其联接的时间复杂度为O(N)O(N)O(N),若没有索引,则可视为最坏的情况,时间复杂度为O(N2)O(N^2)O(N2)
在选择JOIN算法时,会有优先级,理论上会优先判断能否使用INLJ、BNLJ(MySQL内部优化后,基本上不会出现Simple Nested-Loop Join):
Index Nested-LoopJoin > Block Nested-Loop Join > Simple Nested-Loop Join
Simple Nested-Loop Join(笛卡尔积)
最简单的JOIN算法及外循环读取一行数据,根据关联条件列到内循环中匹配关联,在这种算法中,我们通常称外循环表为驱动表,称内循环表为被驱动表
简单嵌套循环连接实际上就是简单粗暴的嵌套循环,如果table1有NNN万条数据,table2有MMM万条数据,那么数据比较的次数=N∗MN*MN∗M,这种查询效率会非常慢 ...
MySQL-排序优化
参考文献
Order By实现原理
利用有序索引获取有序数据
在使用explain分析查询的时候,利用有序索引获取有序数据显示Using index
文件排序
在使用explain分析查询的时候,利用有序索引获取有序数据显示Using filesort
文件排序算法
回表排序模式:是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行指针信息,然后在sort buffer中进行排序.
不回表排序模式:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序.
MySQL主要通过比较我们所设定的系统参数max_length_for_sort_data的大小和Query语句所取出的字段类型大小总和来判定需要使用哪一种排序算法.
如果max_length_for_sort_data更大,则使用第二种优化后的算法,反之使用第一种算法.
所以如果希望ORDER BY操作的效率尽可能的高,一定要注意max_length_for_sort_data 数的设置
12345678mysql> show variables like ...
MySQL-Source-Select
参考文献
MySQL 简单查询语句执行过程分析(一)词法分析 & 语法分析
词法分析&语法分析过程
初始化字段
对于select子句中的每个字段,都会创建一个Item_field类(或子类)的实例。
12345678910111213// sql/item.hclass Item_field : public Item_ident { typedef Item_ident super; private: Field *result_field{nullptr}; Field *last_org_destination_field{nullptr}; Field *last_destination_field{nullptr}; uint32_t last_org_destination_field_memcpyable = ~0U; uint32_t last_destination_field_memcpyable = ~0U; const Item_field *m_base ...
MySQL-变量
参考文献
MySQL是咋样运行的
系统变量
通过启动选项设置
大部分系统变量都可以通过启动服务器时设置启动选项来设置.
1mysqld --default-storage-engine=MyISAM --max-connections=10
通过配置文件添加启动项
123[server]default-storage-engine=MyISAMmax-connections=10
服务器程序运行过程中设置
MySQL支持两种形式的变量:SESSION以及GLOBAL
GLOBAL(全局范围): 影像服务器的整体操作.具有GLOBAL作用范围的系统变量可以称为全面变量.
SESSION(会话范围): 影像某个客户端连接的操作.具有SESSION作用范围的系统变量可以称为会话变量.
1234SET [GLOBAL|SESSION] 系统变量名 = 值# 或者SET [@@(GLOBAL|SESSION).]系统变量名 = 值
变量值还原为默认值:set [session] var_name = DEFAULT
查看不同作用范围的系统变量
1SHOW [G ...
MySQL-配置文件
参考文献
MySQL是咋样运行的
MySQL获取配置信息路径
命令行参数 mysqld_safe --datadir=/data/sql_data
配置文件
确定配置的文件路径
12345678910-- 方法一root@2dd900ce424a:/# which mysqld/usr/sbin/mysqldroot@2dd900ce424a:/# /usr/sbin/mysqld --verbose --help |grep -A 1 'Default options'Default options are read from the following files in the given order:/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf-- 方法二[root@holelin ~]# mysql --help |grep my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT,/etc/my.cnf /etc/mys ...
MySQL源码分析
参考文献
MySQL运维内参:MySQL Galera Inception核心原理与最佳实践
MySQL启动过程
入口函数在sql/main.cc文件中
123extern int mysqld_main(int argc, char **argv);int main(int argc, char **argv) { return mysqld_main(argc, argv); }
MySQL-各个版本的特性
[TOC]
MySQL各个版本的特性
MySQL 3.23
基本的SQL功能
ISAM和MyISAM存储引擎
BDB存储引擎
全文搜索
大文件支持
基本的权限管理
客户端/服务器通信协议
基本的查询优化与缓存
基本的表锁
窗口函数(部分)
MySQL 4.0
InnoDB存储引擎
ACID事务支持
行级锁定
外键约束
查询缓存
压缩协议
大文件支持(更大的文件尺寸)
多表更新与删除
子查询
高效的嵌套查询处理
MySQL 5.0
存储过程与函数
触发器
视图
游标
分区表
插件式存储引擎架构
INFORMATION_SCHEMA数据库
XA分布式事务
在线DDL
日志查询
MySQL 5.5
性能模式
信号处理
分区功能改进
InnoDB插件
语义表分析
语句摘要
度量单位转换
数字类型转换
新的字符集与排序规则
改进的查询优化器
MySQL 5.6
全文搜索改进
备份锁定
优化器跟踪
改进的InnoDB性能
多线程复制
MEMCACHED API支持
NoSQL接口
子查询优化
时间和日期函数改进
字符集和排序规则改进
MySQL 5.7
JSON数据类型
虚拟 ...
MySQL-Predicates in SQL
参考文献
Predicates in SQL
SQL谓词
谓词只是一个计算结果为TRUE、FALSE 或UNKNOWN的表达式.谓词通常用于WHERE和HAVING子句的搜索条件、FROM子句的连接条件以及需要布尔值的查询的任何其他部分.
谓词有多种类型,其中包括:
Comparison(比较谓词)
LIKE
BETWEEN
IN
EXISTS
IS NULL (/INTEGER/DECIMAL/FLOAT...)
Comparison Predicates 比较谓词
= Equal to
> Greater than
< Less than
>= Greater than or equal to
<= Less than or equal to
<> Not equal to
EXISTS
在EXISTS的子查询里SELECT子句的列表可以有三种写法
通配符: SELECT *
常量: SELECT '任意内容'
列名: SELECT col_name
谓词逻辑中,根据输入值的阶数对谓词进行分类.=或者BETWEEE ...
MySQL-常用SQL汇总
参考文献
MySQL按日期分组统计(按天统计,按月统计)
mysql查询今天、昨天、7天、近30天、本月、上一月 数据
SQL进阶教程–[日] MICK
Divided We Stand: The SQL of Relational Division
High Performance Relational Division in SQL Server
按日期分组统计
按月统计
1234567SELECT date_format( create_time, '%Y-%m' ) date, count(*) numFROM table_name GROUP BY date_format( create_time, '%Y-%m' );
按天统计
1234567SELECT date_format( create_time, '%Y-%m-%d' ) date, count(*) num FROM table_name GROUP BY date_format( create_time, '%Y-%m-%d ...
MySQL(二十三)-加锁分析实战
参考文献
解决死锁之路 - 常见 SQL 语句的加锁分析
何登成–管中窥豹——MySQL(InnoDB)死锁分析之道
MySQL · 引擎特性 · InnoDB隐式锁功能解析
Locks Set by Different SQL Statements in InnoDB
MySQL技术内幕 InnoDB存储引擎
27.12.13.1 The data_locks Table
MySQL InnoDB锁介绍及不同SQL语句分别加什么样的锁
一张图彻底搞懂 MySQL 的锁机制
mysql事务和锁 SELECT FOR UPDATE
MySQL锁总结
MySQL DELETE 删除语句加锁分析
加锁实战分析
对于唯一键值的锁定,Next-Key Lock降级为Record Lock仅存在于查询所有的唯一索引列.若唯一索引由多个列组成,而查询仅是查找多个唯一索引列中的其中一个,那么查询其实是range类型,而不是point类型,因此InnoDB存储引擎依然会使用Next-Key Lock进行锁定.
操作序号
SessionA
SessionB
1
begin;
2 ...