mysql体系结构
一.MySQL分层架构
1.链接层
处理网络的链接,链接的网络认证。
- 查看链接权限
-
mysql> select user,host from mysql.user\G;
-
ERROR 2006 (HY000): MySQL server has gone away
-
No connection. Trying to reconnect...
-
Connection id: 3
-
Current database: *** NONE ***
-
-
*************************** 1. row ***************************
-
user: mysql.session
-
host: localhost
-
*************************** 2. row ***************************
-
user: mysql.sys
-
host: localhost
-
*************************** 3. row ***************************
-
user: root
-
host: localhost
-
3 rows in set (0.00 sec)
-
-
ERROR:
-
No query specified
-
-
mysql> grant all on *.* to root@'%' identified by 'root';
-
Query OK, 0 rows affected, 1 warning (0.00 sec)
-
-
mysql> flush privilege;
- 查看连接
-
mysql> show processlist;
-
+----+------+-----------+------+---------+------+----------+------------------+
-
| Id | User | Host | db | Command | Time | State | Info |
-
+----+------+-----------+------+---------+------+----------+------------------+
-
| 3 | root | localhost | NULL | Query | 0 | starting | show processlist |
-
+----+------+-----------+------+---------+------+----------+------------------+
- kill 会话
kill 3;
kill query 4; 杀掉会话正在执行的SQL,而不关闭会话。
- 连接池
(1).如果在程序中,频繁的创建和销毁mysql和客户端连接,开销很严重。
(2).为了减少相关的连接创建的开销,在应用层部署一个连接池。
(3).会保持一定的连接在连接池中,如果应用想请求连接的话,不再需要向mysql请求,而是直接向连接池请求链接,减少了应用和mysqld频繁创建链接的开销。
- 线程池
(1).每个连接过来,就分配一个线程对该链接提供服务,链接撤销后就撤销该线程,在连接的频繁创建与销毁过程中,会需要消耗一定的系统资源。
(2).为了避免这个情况的发生线程池内部的线程是可以共用的,如果连接销毁后,线程是不会被销毁的,可以继续为下一个连接提供服务。
(3).社区版没有线程池的特性
2. SQL层
SQL的查询解析,分析,优化,缓存以及所有的内置函数,所有存储引擎的功能都在这一层实现,比如存储过程。
- 查询缓存
query_cache_size 1048576
query_cache_type OFF
(1).如果mysql之前执行的sql,直接从查询缓存返回结果
(2).局限性比较大,任何查询结果有变更,都需要进行更新,还持有全局锁,锁力度很重,效率很低。
使用场景: 如果查询的SQL语句和结果集比较固定,可以考虑开启查询缓存。
- 修改系统参数
show variables like 'log%';
(1).只读参数:关闭数据库后进行修改,重启数据库后生效,不能在线修改
mysql> set global query_cache_type=on;
ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it
(2).在线参数:可以直接开库修改,不用重启数据库即可生效
(3).全局参数:修改后,所有新会话,会生效
show global variable;
SET GLOBAL var_name = value;
(4).会话参数:只在当前会话生效
show session variable;
SET SESSION var_name = value;
- SQL执行过程
(1).SQL解析(在数据库内部将sql文本转换为sql解析树)
(2).SQL优化改写
(3).SQL的执行计划确立
(4).SQL执行
(5).binlog
3.存储引擎层
MySQL的存储引擎在存储引擎层,负责存储数据。正是因为分层的存在,导致MySQL本身有一些局限性
mysql5.5版本之前默认的存储引擎是MyISAM
查看存储引擎
show plugins;
建表的时候要选择存储引擎
create table t1 (id int) ENGINE=myisam;
show create table t1\G;
- Innodb MyISAM区别
- innodb表结构设计
一对一
一对多
多对多
不推荐使用外键,因为大批量插入数据时,每次插入都要检查外键约束,造成性能大量消耗。 虽然不推荐,但是依赖关系依然存在。
- innodb和myisam读写性能测试