当 MySQL 启动(MySQL 服务器就是一个进程),等待客户端连接,每一个客户端连接请求, 服务器都会新建一个线程处理(如果是线程池的话,则是分配一个空的线程),每个线程独 立,拥有各自的内存处理空间
最大连接数
show VARIABLES like '%max_connections%'
连接到服务器,服务器需要对其进行验证,也就是用户名、IP、密码验证,一旦连接成功, 还要验证是否具有执行某个特定查询的权限(例如,是否允许客户端对某个数据库某个表的 某个操作)
这一层主要功能有:SQL 语句的解析、优化,缓存的查询,MySQL 内置函数的实现,跨存储 引擎功能(所谓跨存储引擎就是说每个引擎都需提供的功能(引擎需对外提供接口)),例如: 存储过程、触发器、视图等。
show variables like '%query_cache_type%' #默认不开启
show variables like '%query_cache_size%' #默认值 1M
SET GLOBAL query_cache_type = 1; #会报错
query_cache_type 只能配置在 my.cnf 文件中,这大大限制了 qc 的作用
在生产环境建议不开启,除非经常有 sql 完全一模一样的查询
QC 严格要求 2 次 SQL 请求要完全一样,包括 SQL 语句,连接的数据库、协议版本、字符 集等因素都会影响
通过上面的 sql 大概就能看出,一个 sql 并 不一定会去查询物理数据,sql 解析器会通过优化器来优化程序员写的 sql
explain select * from account t where t.id in (select t2.id from account t2)
SHOW WARNINGS;
/* select#1 */
SELECT `mall`.`t`.`id` AS `id`,`mall`.`t`.`name` AS `name`,`mall`.`t`.`balance` AS `balance`
FROM `mall`.`account` `t2` JOIN `mall`.`account` `t` WHERE (`mall`.`t`.`id` = `mall`.`t2`.`id`)
可以看出子查询会被解析器优化成JOIN语句。
tips:面试问子查询和JOIN哪个效率高
在 mysql 中其实还有个 schema 的概念,这概念没什么太多作用,只是为了兼容其他数据库, 所以也提出了这个。
在 mysql 中 database 和 schema 是等价的
create database demo;
show databases;
drop schema demo;
show databases;
数据库的数据库(DataDir)
mysql 安装的时候都要指定 datadir,其查看方式为:
show VARIABLES like 'datadir'
,其规定所有建立的数据库存放位置
创建了一个数据库后,会在上面的 datadir 目录新建一个子文件夹
用户建立的表都会在上面的目录中,它和具体的存储引擎相关,但有个共同的就是都有个 frm 文件,它存放的是表的数据格式。
mysqlfrm --diagnostic /usr/local/mysql/data/mall/account.frm
分享链接
提取码:wdyb
tar -zxvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5
python ./setup.py build
python ./setup.py install
#查看你的 mysql 现在已提供什么存储引擎:
mysql> show engines;
#看你的 mysql 当前默认的存储引擎:
mysql> show variables like '%storage_engine%';
MySql 5.5 之前默认的存储引擎
MyISAM 存储引擎由 MYD 和 MYI 组成
create table testmysam (
id int PRIMARY key
) ENGINE=myisam
insert into testmysam VALUES(1),(2),(3)
myisampack -b -f /usr/local/mysql/data/mall/testmysam.MYI
压缩后再往表里面新增数据就新增不了
insert into testmysam VALUES(1),(2),(3)
压缩后,需要
myisamchk -r -f /usr/local/mysql/data/mall/testmysam.MYI
show VARIABLES like 'innodb_log_buffer_size'
create table mycsv(id int not null,c1 VARCHAR(10) not null,c2 char(10) not null) engine=csv;
insert into mycsv values(1,'aaa','bbb'),(2,'cccc','dddd');
vi /usr/local/mysql/data/mall/mycsv.CSV
修改文本数据
flush TABLES;
select * from mycsv
create index idx_id on mycsv(id)
create table myarchive(id int auto_increment not null,c1 VARCHAR(10),c2 char(10), key(id)) engine = archive;
create index idx_c1 on myarchive(c1);
INSERT into myarchive(c1,c2) value('aa','bb'),('cc','dd');
delete from myarchive where id = 1;
update myarchive set c1='aaa' where id = 1;
show VARIABLES like 'max_heap_table_size'
create table mymemory(id int,c1 varchar(10),c2 char(10),c3 text) engine = memory;
create table mymemory(id int,c1 varchar(10),c2 char(10)) engine = memory;
create index idx_c1 on mymemory(c1);
create index idx_c2 using btree on mymemory(c2);
show index from mymemory
show TABLE status LIKE ‘mymemory’