性能监控
show profile
set profiling = 1;
show profile
SHOW PROFILE [type [, type] ... ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]] type: { ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY | PAGE FAULTS | SOURCE | SWAPS }
-
ALL
displays all information -
BLOCK IO
displays counts for block input and output operations -
CONTEXT SWITCHES
displays counts for voluntary and involuntary context switches -
CPU
displays user and system CPU usage times -
IPC
displays counts for messages sent and received -
MEMORY
is not currently implemented -
PAGE FAULTS
displays counts for major and minor page faults -
SOURCE
displays the names of functions from the source code, together with the name and line number of the file in which the function occurs -
SWAPS
displays swap counts
profile属性
Performance Schema
监控当前服务器上性能使用情况
官方地址:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-quick-start.html
Performance Schema 默认开启,可以在my.cnf文件中配置
[mysqld]
performance_schema=ON
当启动mysql服务,尝试初始化 Performance Schema,验证初始化是否成功可以用到下面的语句
mysql> SHOW VARIABLES LIKE 'performance_schema'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | performance_schema | ON | +--------------------+-------+
Value是ON就意味着初始化成功
performance_schema表的分类
performance_schema库下的表可以按照监视不同的纬度分组
- 语句事件记录表,这些表记录了语句事件信息
- 当前语句事件表events_statements_current、
- 史语句事件表events_statements_history
- 长语句历史事件表events_statements_history_long
- 聚合后的摘要表summary
- summary表还可以根据帐号(account),主机(host),程序(program),线程(thread),用户(user)和全局(global)再进行细分
--语句事件记录表 show tables like '%statement%'; --等待事件记录表,与语句事件类型的相关记录表类似: show tables like '%wait%'; --阶段事件记录表,记录语句执行的阶段事件的表 show tables like '%stage%'; --事务事件记录表,记录事务相关的事件的表 show tables like '%transaction%'; --监控文件系统层调用的表 show tables like '%file%'; --监视内存使用的表 show tables like '%memory%'; --动态对performance_schema进行配置的配置表 show tables like '%setup%';
instruments和consumers
--打开等待事件的采集器配置项开关,需要修改setup_instruments配置表中对应的采集器配置项 UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES'where name like 'wait%'; --打开等待事件的保存表配置开关,修改setup_consumers配置表中对应的配置项 UPDATE setup_consumers SET ENABLED = 'YES'where name like '%wait%';
*************************** 1. row *************************** THREAD_ID: 11 EVENT_ID: 570 END_EVENT_ID: 570 EVENT_NAME: wait/synch/mutex/innodb/buf_dblwr_mutex SOURCE: TIMER_START: 4508505105239280 TIMER_END: 4508505105270160 TIMER_WAIT: 30880 SPINS: NULL OBJECT_SCHEMA: NULL OBJECT_NAME: NULL INDEX_NAME: NULL OBJECT_TYPE: NULL OBJECT_INSTANCE_BEGIN: 67918392 NESTING_EVENT_ID: NULL NESTING_EVENT_TYPE: NULL OPERATION: lock NUMBER_OF_BYTES: NULL FLAGS: NULL /*该信息表示线程id为11的线程正在等待buf_dblwr_mutex锁,等待事件为30880 属性说明: id:事件来自哪个线程,事件编号是多少 event_name:表示检测到的具体的内容 source:表示这个检测代码在哪个源文件中以及行号 timer_start:表示该事件的开始时间 timer_end:表示该事件的结束时间 timer_wait:表示该事件总的花费时间 注意:_current表中每个线程只保留一条记录,一旦线程完成工作,该表中不会再记录该线程的事件信息 */
-- history表中记录每个线程应该执行完成的事件信息,但每个线程的事件信息只会记录10条,再多就会被覆盖, -- *_history_long表中记录所有线程的事件信息,但总记录数量是10000,超过就会被覆盖掉 select thread_id,event_id,event_name,timer_wait from events_waits_history order by thread_id limit 21; -- summary表提供所有事件的汇总信息,该组中的表以不同的方式汇总事件数据(如:按用户,按主机,按线程等等) -- 例如:要查看哪些instruments占用最多的时间 -- 可以通过对events_waits_summary_global_by_event_name表的COUNT_STAR或SUM_TIMER_WAIT列进行查询 --(这两列是对事件的记录数执行COUNT(*)、事件记录的TIMER_WAIT列执行SUM(TIMER_WAIT)统计而来) SELECT EVENT_NAME,COUNT_STAR FROM events_waits_summary_global_by_event_name ORDER BY COUNT_STAR DESC LIMIT 10; -- instance表记录了哪些类型的对象会被检测。这些对象在被server使用时,在该表中将会产生一条事件记录 -- 例如,file_instances表列出了文件I/O操作及其关联文件名 select * from file_instances limit 20;
show processlist
查看连接数
官方地址:https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html
查询结果示例
*************************** 1. row *************************** Id: 1 User: system user Host: db: NULL Command: Connect Time: 1030455 State: Waiting for master to send event Info: NULL *************************** 2. row *************************** Id: 2 User: system user Host: db: NULL Command: Connect Time: 1004 State: Has read all relay log; waiting for the slave I/O thread to update it Info: NULL *************************** 3. row *************************** Id: 3112 User: replikator Host: artemis:2204 db: NULL Command: Binlog Dump Time: 2144 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL *************************** 4. row *************************** Id: 3113 User: replikator Host: iconnect2:45781 db: NULL Command: Binlog Dump Time: 2086 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL *************************** 5. row *************************** Id: 3123 User: stefan Host: localhost db: apollon Command: Query Time: 0 State: NULL Info: SHOW FULL PROCESSLIST
IP处理语句
inet_aton()
mysql> SELECT INET_ATON('209.207.224.40'); -> 3520061480
inet_ntoa()
mysql> SELECT INET_NTOA(3520061480); -> '209.207.224.40'
数据类型选择
尽量避免使用null
整型,选择符合业务场景最小的数据类型
- TINYINT
- SMALLINT
- MEDIUMINT
- INT
- BIGINT
字符类型
char
- 固定长度,最大长度255,自动删除末尾的空格
- 检索效率,写效率比varchar高,空间换时间
- 适用场景,md5摘要
- 存储短字符串,经常更新的字符串
varchar
- 可变长度
- varchar(n),小于等于n使用额外一个字节,大于n使用额外两个字节
- varchar在5.6之前,改变长度或者从255变更到255以上,会导致锁表
- varchar适合于存储长度波动大,字符串较少更新的场景
text,字符串
blob,二进制
二者都作为独立对象,都是为了存储大数据而设计的
datetime 时间类型
- 占用8个字节
- 与时区无关,数据库时区配置,对datetime无关
- 可保存到毫秒
- 可保存时间范围大
- 不要用字符串存储日期类型
timestamp
- 占用4个字节
- 时间范围,1970-01-01到2038-01-19
- 采用整型存储
- 依赖数据库设置的时区
- 自动更新timestamp列的值
date
- 占用字节比datetime,int存储要少,使用date类型3字节
- 使用date类型可以利用日期时间函数进行日期之间的计算
- date类型保存1000-01-01到9999-12-31之间的日期
枚举类型
可以替代常用字符串类型,建立一个数字-字符串映射关系
建一个表
create table enum_test(e enum('test_1', 'test_2', 'test_3') not null);
查询一下e
select e+0 from enum_test
SHOW PROFILE [type [, type] ... ]
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]]
type: {
ALL
| BLOCK IO
| CONTEXT SWITCHES
| CPU
| IPC
| MEMORY
| PAGE FAULTS
| SOURCE
| SWAPS
}