mysql总结3. 应用开发
SQL 关键字
数据读取(备份)
过程、函数、事件、视图、触发器
用户权限
加密技术
SQL 注入
监控
管理维护
4. SQL 关键字
SELECT/FROM/JOIN/WHERE
GROUP BY/HAVING/ORDER BY/LIMIT
表达式
SELECT uid,(SELECT max(player_level)
FROM levelup WHERE levelup.uid =
player.uid AND levelup.t_when <=
player.t_when) AS level FROM player
In/exists
5. 数据读取
逻辑
Mysqldump
select ... into outfile
mysql < backup.sql
load data infile
mysql import
物理
MyISAM : hotcopy
InnoDB : ibbackup
6. 用户
建立用户
create user ‘huangk’@‘localhost’ identified by
‘root’;
drop user huangk;
用户信息
rename ‘huangk’@‘localhost’ to
‘huangk’@‘192.***.***.***’
update user set
password=PASSWORD(‘select’) where
user=‘huangk’
7. 权限
查看权限
show privileges;
show grants for usename@hostname;
授予权限
grant privileges(all: 所有权限 usage :没有权限 )
on dbname.tablename
to username@hostname
with grant option
8. 权限
更新权限
flush privileges;
执行后,对访问权限做出的改变才会生效
回收权限
revoke privileges
on dbname.tablename
from username@hostname
9. 数据表维护
修复 MyISAM 文件
myisamchk [options] tablename1
压缩 MyISAM 文件
myisampack [options] tablename1
查看信息
mysqlshow
服务器管理
mysqladmin
10. 数据表维护
检查或维护 MyISAM 表
CHECK TABLE
REPAIR TABLE
优化 MyISAM 表
OPTIMIZE TABLE
分析 MyISAM 表
ANALYZE TABLE
11. 移动数据库目录
把 MySQL 服务进程停掉
mysqladmin -uroot -proot shutdown
移动目录
mv -r /var/lib/mysql /home/mysql
编辑 MySQL 的配置文
件 /etc/mysql/my.cnf
[mysqld]
socket = /home/mysql/mysqld.sock
datadir = /home/mysql
log_bin = /home/mysql/mysqlbin.log
12. 移动数据库目录
移动数据目录后 , 权限发生变化,需要设
置 mysql 组用户具有权限
chown -R mysql:mysql /home/mysql
chmod mysql+x /home/mysql
重新启动 MySQL 服务
/etc/init.d/mysql start
14. 目标
减少 I/O ,磁盘 I/O 转到内存 I/O
降低 CPU 运算
优先优化高并发的 SQL
EXPLAIN
SET PROFILING=1
SHOW PROFILE
15. 系统设计
表结构(横表 or 竖表)
数据类型
数据编码
引擎(物理文件)
索引
锁
日志文件
Replication 文件
参数文件
18. 数据类型
数字类型
DOUBLE 、 DECIMAL 慎用
unsigned TINYINT/INT/BIGINT
字符类型
char
varchar: 长度不同, MySQL 不同的存储处理
text
LOB 类型
保留许多不常用的字段信息
19. 数据类型
时间类型
TIMESTAMP 类型,其存储空间只需要 DATETIME 类型
的一半。
DATE 类型,存储空间只需要 3 个字节,比 TIMESTAMP
还少。
INT 类型类存储一个 unix timestamp 的值,不直观,
会给维护带来不必要的麻烦
ENUM & SET
使用 ENUM 来存放状态字段,即使需要增加新的
类型,只要增加于末尾,修改结构也不需要重
建表数据。
使用 SET 类型存放可预先定义的属性数据。
20. 数据编码
不同的字符集 -> 不同的存储空间 ->I/O
UTF8 或 UNICODE 字符
规范对象命名
sql 语句的所有表名、字段名全部小写,系统保留字、内置函数名
、 sql 保留字大写
Select/From/Where/Order by/Group by/limit 等子句必须另
其一行写
在 T-SQL 代码中为字符常量使用单引号 , 避免使用双引号
22. MyISAM 引擎
索引缓存优化
key_buffer_size :索引缓存大小
key_buffer_block_size :
key_cache_division_limit :
key_cache_age_threshold :
多 key cache
key cache 的 Mutex
key cache 预加载
表读取索引优化
read_buffer_size :顺序读数据
read_md_buffer_size :随机读数据
23. InnoDB 引擎
索引缓存
Innodb_buffer_pool_*
Innodb_log_buffer_size
事务优化
innodb_flush_log_at_trx_commit
数据存储
24. InnoDB 引擎
两次写 double write
skip_innodb_doublewrite: 禁止两次写功能,
可能发生写失效问题
插入缓冲 insert buffer
自适应哈希索引
自动根据访问的频率和模式来为某些页建立哈希
索引
innodb_adaptive_hash_index: 禁用或启动此
特性
25. InnoDB 引擎
表空间
每张表都有个主键。如果不指定,如果表中有
非空的唯一索引,则该列为主键,否则自动创建
一个 6 字节大小的指针。
每个表单独一个表空间,存放的只是数据、索
引、插入缓冲信息;撤销信息、系统事务信息、
二次写缓冲还是存放在原来的共享表空间内。
段
数据段
索引段
26. InnoDB 引擎
页
数据页 B-tree Node
Undo 页 Undo Log Page
系统页 System Page
事务数据页 Transaction system Page
插入缓冲位图页 Insert Buffer Bitmap
插入缓冲空闲列表页 Insert Buffer Free List
未压缩的二进制大对象页 Uncompressed BLOB
Page
压缩的二进制大对象页 Compressed BLOB Page
27. InnoDB 引擎
行记录格式
Compact 行记录格式
Redundant 行记录格式
行溢出数据
Compressed 行记录格式
Dynamic 行记录格式
28. 事务
脏读 ( 事务没提交,提前读取 ) :脏读就是指当一个事务正在
访问数据,并且对数据进行了修改,而这种修改还没有提交到
数据库中,这时,另外一个事务也访问这个数据,然后使用了
这个数据。
不可重复读 ( 两次读的不一致 ) :是指在一个事务内,多次读
同一数据。在这个事务还没有结束时,另外一个事务也访问该
同一数据。那么,在第一个事务中的两次读数据之间,由于第
二个事务的修改,那么第一个事务两次读到的的数据可能是不
一样的。这样就发生了在一个事务内两次读到的数据是不一样
的,因此称为是不可重复读。
幻读:是指当事务不是独立执行时发生的一种现象,例如第一
个事务对一个表中的数据进行了修改,这种修改涉及到表中的
全部数据行。同时,第二个事务也修改这个表中的数据,这种
修改是向表中插入一行新数据。那么,以后就会发生操作第一
个事务的用户发现表中还有没有修改的数据行,就好象发生了
幻觉一样。
31. 锁
行级锁定( row-level )
InnoDB
NEXT-KEY LOCKING 间隙锁的锁实现方式,会锁定
不存在的键值
表级锁定( table-level )
MyISAM
Table_locks_% 表级锁定参数
页级锁定( page-level )
Innodb_row_lock_% 行级锁定参数
33. 日志文件
错误日志 Error log
show variables like 'log_error‘
查询日志 query log
5.1 后 mysql.general_log 表中
34. 日志文件
二进制日志 binary log
所有修改数据库数据的 QUERY 语句,事务安全
mysqlbinlog 工具
默认二进制日志不启动。开启这个选项可能有性
能下降
sync_binlog: 磁盘同步间隔事务数
binlog_cache_size: 事务过程中二进制日志
SQL 语句的缓存大小
max_binlog_cache_size:binlog 使用的最大
cache 内存大小
35. 日志文件
二进制日志 binary log
binlog_format:statement 、 row 、 mixed
binlog_do_db
binlog_ignore_db
binlog_cache_use: 记录用缓冲写二进制日志次
数
binlog_cache_disk_use: 记录用临时文件写二
进制次数,判断 binlog_cache_size 设置是否合
理
36. 日志文件
慢查询日志 slow query log
mysqlslowdump 慢查询日志工具
log_queries_not_using_indexes:on/off
long_query_time :记录执行时间超过多长的
query
log_slow_queries:on/off
5.1 后 存放在 mysql.slow_log 表中
InnoDB 的在线 REDO 日志 InnoDB REDO log
innodb_log_file_size
innodb_log_files_in_group
innodb_mirrored_log_groups
innodb_log_group_home_dir
37. 参数配置
Cache
buffer
memory
IO
swap
cpu
connection
thread
query cache
table cache
38. query cache
Hash 运算及查找资源消耗
Query cache 失效问题
缓存 Result Set :一条记录可能多次缓存
have_query_cache
Query_cache* :参数变量
Qcache* : query cache 的使用情况
39. connection
max_connections: 最大连接数
max_user_connnections :每个用户允许的最大连
接数
net_buffer_length: 网络传输效率
max_allowed_packet: 一次消息传输量的最大值
back_log: 等待队列中允许存放的最大连接请求数
连接池
thread_cache_size :应该存放的连接线程数
thread_stack :每个连接线程被分配的内存大小
41. SQL 语句
只 select 需要的数据字段,减少网络和内存
数据传输量
避免在条件中对索引做函数转换
避免使用不等于条件
like 操作以通配符 ( 如’ %data’) 开始,无法
使用索引
42. SQL 语句
Join
Nested loop join :通过驱动表的结果集作为循环
基础数据,然后将结果集中的数据作为过滤条件一
条条地到下一个表中查询数据,最后合并结果
order by
索引排序
排序算法
取出排序字段以及相应行指针
取出排序字段以及所有字段
max_lenght_for_sort_data :决定算法问题
sort_buffer_size :减少数据分段、减少临时
表交换排序
43. SQL 语句
Group by
1 、松散索引
group by 条件字段位于同一个索引最前面位
置
只能用 max 和 min 两个聚合函数
2 、紧凑索引
3 、临时表
Distinct
与 group by 操作非常相似, group by 之后每
组中取出一条记录而已
distinct 并不需要排序
44. SQL 语句
Union
尽量 union all 而不去重
Limit
join 表之前可以过滤数据量
Count
count(*) 优于 count(1)
count(column) 是表示结果集中有多少个
column 字段不为空的记录; count(*) 是表示整
个结果集有多少条记录