Mysql¶
-
mycli 安装centos7¶
python3 -m pip install --upgrade pip
pip3 install mycli
[安装地址](https://www.mycli.net/install)
Note:Python 3.6+
-
功能¶
-
连接器: 连接用户的连接
- 分析器: 词法分析,语法分析
- 优化器: 优化SLQ语句,规定执行流程
-
执行器 :SQL语句的执行
-
调优¶
-
show profiling
- Performance Schema
- 尽量避免null
-
选择最小的数据类型
-
数据类型¶
-
类型 空间 有符号的最小值 有符号的最大值 无符号最小值 无符号最大值 TINYINT 8 -128 127 0 255 SMALLINT 16 -32768 32767 0 65535 MEDIUMINT 24 -8388608 8388607 0 16777215 INT 32 -2147483648 2147483647 0 4294967295 BIGINT 64 -2 ^63 2 ^63-1 0 2^64-1 -
Value CHAR(4)Storage Required VARCHAR(4)Storage Required ''' '4 bytes ''1 byte 'ab''ab '4 bytes 'ab'3 bytes 'abcd''abcd'4 bytes 'abcd'5 bytes 'abcdefgh''abcd'4 bytes 'abcd'5 bytes varchar 会用1个字节或2个字节长度的前缀数据 不超过255 一个字节使用1个长度,超过255 字节使用2个字节长度
char 最大值255 varchar最大值65535
-
Data Type “Zero” Value rang Storage Required DATE'0000-00-00'1000-01-01 ~ 9999-12-31 3bytes TIME'00:00:00'DATETIME'0000-00-00 00:00:00'1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8bytes 毫秒 TIMESTAMP'0000-00-00 00:00:00'1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 4bytes 秒 YEAR0000datetime: 占用空间大,损失日期类函数 与时区无关,字符串 timestamp: 采用整型存储,依赖时区,
date: 可以使用日期类函数,字符串
-
存储引擎¶
| MyISAM | InnoDB | |
|---|---|---|
| 支持版本 | 5.5之前 | 5.5之后 |
| 事务 | N | Y |
| 表锁 | Y | Y |
| 行锁 | N | Y |
| 外键 | N | Y |
| count | 保存有表的总行数 | 没有保存表的总行数 |
| CURD操作 | 大量的SELECT | 大量的DELETE,INSERT,UPDATE |
| B+tree | 叶子节点存放数据索引 | 叶子节点存放数据 |
+----+--+------+------------+------+---------------+--------+---------+--------+------+----------+--------+
| id |select_type|table|partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+----+-------+------------+------+-- -------+--------+---------+--------+------+----------+--------+
| 1 | SIMPLE | staff | <null>| ALL | <null> | <null> | <null> | <null> | 2 | 100.0 | <null> |
+----+---+-------+----------+------+---------------+--------+---------+--------+------+----------+--------+
type优先级:
system > const > eq_ref > ref > fulltext > ref_or_null>index_merge>unique_subquery>index_sumquery>range>index>alll
-
索引¶
-
回表
- 普通索引叶子节点存放的是主键id
- 查到主键id再查主键id数的数据
-
索引覆盖
select id from user where name= 1 -
最左匹配
select * from user where age=? and name =? select * from user whre -
索引下推 组合索引
多个条件 返回数据集合,返回后判断,返回前判断
-
数据导入¶
source /xxx/xxx.sql
-
优化¶
-
查询执行时间
set profiling=1; show profiles; #最后一次查询时间 show status like '%last_query_const%' -
order by 排序
# 没超过使用单次排序, 超过是有两次排序 show variables like '%max_length_for_sort_data%';-
使用索引排序
-
排序都是 aes or desc
-
第一列使用范围查询不能在使用索引排序
-
两次传输排序
-
一次只查询排序字段
-
二次查询排序完的数据
-
-
单次传输排序
- 读取数据的所有列并排序
-
-
类型转换会产生全表索引
sql select name,age,phone from user wehre phone =143XXXX8423 select name,age,phone from user wehre phone ='143XXXX8423' -
建立索引优化
-
区分不大的列不建索引
-
使用区分度规划索引 80%
sql select count(destinct("列名")/count(*)) from table; -
一张表索引数量不要超过5个
-
join 不超过3张表
-
-
查询优化
- 系统性能
- 不建议使用select *
- 等值传播(术语) 多张表where加相同的查询条件写一个条件就可以
-
join优化
# 默认256k show variables like '%join_buffer_size%'; # optimizer_switch block_nested_loop 设置为on 默认开启 show variables like '%optimizer_switch%'; -
Limit 优化
select * from user limit 10000,10; select * from user a join(select id from user limit 10000,10) b on a.id = b.id; -
分区¶
-
分区类型¶
- 范围划分
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT NOT NULL, store_id INT NOT NULL ) PARTITION BY RANGE (store_id) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16), PARTITION p3 VALUES LESS THAN (21) );- 列表分区
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT, store_id INT ) PARTITION BY LIST(store_id) ( PARTITION pNorth VALUES IN (3,5,6,9,17), PARTITION pEast VALUES IN (1,2,10,11,19,20), PARTITION pWest VALUES IN (4,12,13,14,18), PARTITION pCentral VALUES IN (7,8,15,16) );-
列分区
-
hash分区
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT, store_id INT ) PARTITION BY HASH(store_id) PARTITIONS 4;- key分区
CREATE TABLE tm1 ( s1 CHAR(32) PRIMARY KEY ) PARTITION BY KEY(s1) PARTITIONS 10;- 子分区
-
管理¶
- 使用分区选择来获取此信息
mysql> SELECT * FROM tr PARTITION (p2); +------+-------------+------------+ | id | name | purchased | +------+-------------+------------+ | 2 | alarm clock | 1997-11-05 | | 10 | lava lamp | 1998-12-25 | +------+-------------+------------+ 2 rows in set (0.00 sec)- 删除分区
ALTER TABLE tr DROP PARTITION p2;- 添加分区
mysql> ALTER TABLE members > ADD PARTITION ( > PARTITION n VALUES LESS THAN (1970)); -
配置¶
-
跳过认证插件
# 配置 vim /etc/my.cnf --skip-grant-tables[={OFF|ON}] 类型 布尔值 默认值 OFF -
连接
# 查看最大连接数 show variables like '%max_connections%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 151 | +-----------------+-------+ set global max_connections=3000 # 限制用户的连接数 show variables like '%max_user_connections%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | max_user_connections | 0 | +----------------------+-------+ set global max_user_connections = 10; # 等待队列 show variables like '%back_log%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | back_log | 80 | +---------------+-------+ # 配置 vim /etc/my.cnf # max_connections = 3000 # max_user_connections=10 # back_log=80 -
查询语句
# 查看执行的信息 show processlist -
# log_bin show variables like '%log_bin%'; +---------------------------------+--------------------------------+ | Variable_name | Value | +---------------------------------+--------------------------------+ | log_bin | ON | | log_bin_basename | /var/lib/mysql/mysql-bin | | log_bin_index | /var/lib/mysql/mysql-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+--------------------------------+ # vim /etc/my.cnf log-bin=mysql-bin server-id=1 # 二进制日志格式 binlog_format=ROW # 指定而精致日志的数据库 binlog-do-db=db_name # 忽略的db数据库 binlog-ignore-db=db_name # 查询日志 show variables like '%general_log%'; +------------------+-----------------------------------+ | Variable_name | Value | +------------------+-----------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/VM-21-8-centos.log | +------------------+-----------------------------------+ # 慢查询 show variables like '%slow_query_log%'; +---------------------+----------------------------------------+ | Variable_name | Value | +---------------------+----------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/VM-21-8-centos-slow.log | +---------------------+----------------------------------------+ # 慢查询时间 show variables like '%query_time%'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ # 查询缓存 show variables like '%query_cach%'; +------------------------------+---------+ | Variable_name | Value | +------------------------------+---------+ | have_query_cache | YES | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 1048576 | | query_cache_type | OFF | | query_cache_wlock_invalidate | OFF | +------------------------------+---------+ # 缓存状态查询 show status like '%Qcache%'; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 1031832 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 12 | | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+---------+ # 排序缓存 show variables like '%sort_buffer_size%'; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | innodb_sort_buffer_size | 1048576 | | myisam_sort_buffer_size | 8388608 | | sort_buffer_size | 262144 | +-------------------------+---------+ -
锁¶
-
MySAM 表锁
- 共享读锁
- 独占血锁
lock table user read; lock table user write; unlock table; # 状态查询 show status like "%table_locks%" +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Table_locks_immediate | 122 | | Table_locks_waited | 0 | +-----------------------+-------+ -
InnoDB
autocommit=1 # 立即生效,自动提交 autocommit=0 # 不生效,commit命提交-
共享锁
select * from user where id =1 lock in share mode; -
排它锁
select * from user where id =1 for update;
-