信息的价值会随时间锐减,尤其在事故处理过程中。

外键约束

  • 父表和子表(有外键的表称为子表)必须使用相同的存储引擎,且存储引擎必须为InnoDB.外键列和被参照列的数据类型要相同,外键约束将自动创建索引。
  • 查看建表语句可以使用SHOW CREATE TABLE t_users;
  • 查看索引SHOW INDEXES FROM t_users\G;

在实际的开发中我们很少使用物理的外键约束,因为只有InnoDB这种引擎支持。所谓逻辑上的外键约束是在定义表的时候按照某种结构进行定义而不去使用foreign key这个关键字。业务爆炸的时候DB外键的约束可能对分库分表不友好。

mysql中的索引默认是BTree索引。

参见外键约束

表结构的修改

参见修改表

无限分类的表的设计

例如:天猫的商品:图书下面有小说、文学,在文学下面有四大名著、戏曲等。无限分类的表一般采用如下形式:

1
2
3
4
5
CREATE TABLE tdb_goods_types(
type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
type_name VARCHAR(20) NOT NULL,
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
);

查询的时候要根据自身连接。

MySQL常用脚本

1
SELECT * FROM t_users ORDER BY rand(); -- mysql输出的行随机排列

MySQL存储过程

在终端输入SQL语句后MySQL引擎做了下面的事情:

MySQL引擎解析SQL的过程

如果我们省略了SQL语句的语法解析和编译的过程,数据库的效率将会提高。

存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。在首次执行的时候和SQL语句耗时相同,但是以后执行的时候直接从内存中读取;减少了http流量(只需要传递存储过程的名字和必要的参数)。

MySQL存储引擎

  • MyISAM
  • InnoDB
  • Memory
  • CSV
  • Archive

读锁具有共享性,而写锁具有排他性。
BlackHole存储引擎(黑洞引擎)写入的数据都会丢失,一帮用于数据复制的中继。

Q1:为什么表锁比行锁开销小?
A1:表锁整张表只需要一个锁,而行锁对于一张表来说可能需要多个。

MySQL存储引擎

备份和还原MySQL

1
2
$ mysqldump -uniuniu -pniuniu@123 --all-databases > data.sql # 备份
$ source ~/Downloads/data.sql # 还原数据库

授权

1
2
3
# 对用户进行密码的授权
$ grant all on *.* to niuniu@'%.%.%.%' identified by 'niuniu@123';
$ flush privileges;

外键将表分开,而连接将表中的数据归并显示。

注:本项目所有源码参见coding.net

查看多张表中相同字段的最大值

连接查询

1
2
3
4
5
tagid bookid tagname
1 10 php
2 10 web
3 8 php
4 9 ruby

找出tagname同时包含web和php的书:需要用到同一张表的连接查询

1
SELECT * FROM tags INNER JOIN tags t ON tags.bookid = t.bookid WHERE tags.tagname = 'php' AND t.tagname = 'web';