MySQL 建表剖析

Posted by Jackson on 2017-08-13

创建数据库

核心三条:

1
2
3
create database bigdata;
grant all privileges on *.* to jspon@'%' identified by '123456';
flush privileges;

在登录mysql的时候 mysql -urooot -p -和p之间不能有空格

show processlist

1
2
3
4
5
6
7
8
mysql> show processlist;
+----+------+--------------------+---------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+--------------------+---------+---------+------+-------+------------------+
| 5 | root | localhost | NULL | Query | 0 | init | show processlist |
| 6 | root | 192.168.52.1:62593 | bigdata | Sleep | 3 | | NULL |
| 7 | root | 192.168.52.1:62594 | NULL | Sleep | 21 | | NULL |
+----+------+--------------------+---------+---------+------+-------+------------------+

如果我们的mysql服务夯住了,可以查看是哪个sql导致的,查找消耗时间长的,确认好可以kill后,可以杀掉该sql

杀掉sql kill id 杀掉对应的id即可

MySQL的字段类型

数值类型
int 整数
long 长整型
float 单精度
double 双精度
decimal 小数值 金额

字符串类型
char 字节 定长 0-255字节 axxxxxxxxx 会自动补全 255字节
varchar 字符串 变长 0-65535字节 a

日期
date 日期 YYYY-MM-DD
time 时间 HH:MM:SS
datetime 年月日时分秒 YYYY-MM-DD HH:MM:SS
timestamp 年月日时分秒 YYYY-MM-DD HH:MM:SS

建表规划

建表实例:

1
2
3
4
5
6
7
8
9
10
11
create table student(
id int(11) not null auto_increment,
name varchar(200),
age int(3),

createuser varchar(200) ,
createtime timestamp not null default current_timestamp,
updateuser varchar(200) ,
updatetime timestamp not null default current_timestamp on update current_timestamp,
primary key (id)
);

建表剖析:

1.表的名称 字段的名称不要是中文也不要是汉语拼音

2.统一建表的风格例如创建时间:create_time

3.表中的第一个字段必然是 id 自增长的 主键 无意义,设置的目的是使MySQL能够高性能的存储和查询
MySQL使用自增长主键的优势 https://www.jianshu.com/p/b8d6d809fce3

4.表中的的主键设置成id时候,业务字段需要唯一时候可以使用唯一性约束 unique
在约束里面进行设置添加新的约束字段

一张表只能够有一个主键
主键 = unique + not null

1
2
ALTER TABLE bigdata.student
ADD CONSTRAINT student_un UNIQUE KEY (name) ;

5.最后的四个字段建议都加上

1
2
3
4
createuser varchar(200) ,
createtime timestamp not null default current_timestamp,
updateuser varchar(200) ,
updatetime timestamp not null default current_timestamp on update current_timestamp,

最后一个为设置修改时间

6.业务字段要加上注释

COMMENT '用户名称’
COMMENT ‘用户年龄’

7.字符集和引擎

建表语句中有默认的引擎和字符集

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(200) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
`createuser` varchar(200) DEFAULT NULL,
`createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updateuser` varchar(200) DEFAULT NULL,
`updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `student_un` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1
2
3
4
5
6
7
mysql> show create database bigdata;
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| bigdata | CREATE DATABASE `bigdata` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

DEFAULT CHARACTER SET latin1 默认的数据库的字符集是拉丁字符集

字符集分类:数据库字符集、表字符集、列字符集

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> show variables like '%char%';
+--------------------------+---------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.6.23-linux-glibc2.5-x86_64/share/charsets/ |
+--------------------------+---------------------------------------------------------------+

遇到插入问题时候先确定客户端的字符集、链接的字符集、数据库的字符集、服务端的字符集

8.注意事项:

在生产环境时候对于更新和删除操作的时候要确定好条件,执行查询条件的时候可以先limit 20 取出数据看看,不要执行select * from table_name