原谅转自:http://www.cnblogs.com/waterystone/p/5085825.html
一. 规范
- 编程时一般关键字大写,其他小写;
- 尽量少用join查询;
- 选择小而简单的数据类型,尽量避免NULL(使得索引复杂,可用DEFAULT);
- 除非有非常特别的原因需要其他存储引擎,否则应该优先考虑InnoDB引擎;
- 尽量使用整型定义主键。使用InnoDB应该尽可能按主键顺序插入数据,并尽可能使用单调增加的聚簇键。
二. 库相关
1.1 MySQL
1.1.1 版本
1
|
SELECT
VERSION();
|
2.1 用户
2.1.1 创建
1
|
CREATE
USER
'test'
@
'%'
IDENTIFIED
BY
'123456'
;
|
如果新用户权限拒绝,编辑/etc/my.cnf:
[mysqld]
skip-grant-tables
2.1.2 授权
1
|
grant
all
privileges
on
*.*
to
test@
"%"
identified
by
'1234'
;
|
2.1.3 删除
1
|
Drop
USER
test;
|
2.1.4 登陆
1
2
|
mysql -u root -p -h localhost -P 3306
/home/q/mysql/bin/mysql
-uroot -h127.0.0.1 -P3306
|
三. 表结构
3.1 查看创建完整结构
1
2
3
4
5
6
7
|
DESC
my_table;
SHOW
CREATE
TABLE
my_table;
SHOW COLUMNS
FROM
my_table
LIKE
"my_field"
;
USE information_schema;
SELECT
column_name
FROM
columns
WHERE
table_name=
'my_table'
;
SELECT
ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_COMMENT
FROM
information_schema. COLUMNS
WHERE
table_schema =
'my_db_name'
AND
table_name =
'my_table_name'
;
|
3.2 重命名
1
|
RENAME
TABLE
my_table
TO
my_table_new,other_table
TO
other_table_new;
|
3.3 创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
CREATE
TABLE
`my_table` (
`id`
int
(11)
NOT
NULL
AUTO_INCREMENT,
`nid`
bigint
(20)
NOT
NULL
references
t_keywords(id),
`ugc_name`
varchar
(20)
NOT
NULL
COMMENT
'名称'
,
`ugc_type` enum(
'one'
,
'two'
,
'three'
)
NOT
NULL
DEFAULT
'one'
,
`total_count`
int
(11) unsigned
NOT
NULL
DEFAULT
'0'
,
`data` json,
`create_date`
date
NOT
NULL
,
`insert_time` datetime
NOT
NULL
DEFAULT
'1970-01-01 00:00:00'
,
`updateTime`
timestamp
NULL
DEFAULT
CURRENT_TIMESTAMP
ON
UPDATE
CURRENT_TIMESTAMP
,
`is_finished` tinyint(3)
NOT
NULL
DEFAULT
'0'
,
PRIMARY
KEY
(`id`),
KEY
`idx_keyword_id_is_finished` (`keyword_id`,`is_finished`)
) ENGINE=InnoDB
DEFAULT
CHARSET=utf8
COLLATE
=utf8_bin
#复制表结构
CREATE
TABLE
my_table_new
LIKE
my_table;
#将
select
的结果存成表(保留原字段的属性设置,但不复制索引)
CREATE
TABLE
my_table_new ENGINE=INNODB
AS
SELECT
*
FROM
my_table;
|
3.4 数据类型
类型名称 | 占用空间 | 可用默认值 | 说明 |
tinyint | 1B | -128~127 | 小整数型 |
smallint | 2B | -32768~32767 | 大整数型 |
mediumint | 3B | -8388608~8388607 | 大整数型 |
int/integer | 4B | -2147483648~2147483647 | 大整数型 |
bitint | 8B | -9233372036854775808~9223372036854775807 | 极大整数型 |
float | 4B | -3.402823466E+38~1.175494351E-38 | 单精度浮点数型 |
double | 8B | 1.7976931348623157E+308~2.2250738585072014E-308 | 双精度浮点数型 |
decimal(m,d) | 对小数需要精确计算时用此类型,但在mysql处理时会转为double,所以能不用此类型尽量不用。 | ||
char | 定长字符串,一个字符长度为1,但根据字符集一个字符可能占多个字节 (适用于定长或较短的串) 注:在多字节字符编码中,innodb将char视为非定长,按varchar存储 | ||
varchar | 0~65535B | Latin1(1B/字符):0~65532字符 utf-8(1~3B/字符):21845字符 gbk(2B/字符):32767字符
| 变长字符串 。适用于长度变化大且更新少(压缩存储,若经常变大,则可能需要分裂页的操作)。存储时,按实际存入数据存储。并有额外字段标记其长度,以便定位。 注:所有varchar列总长度之和不能超过65536B |
tinyblob/tinytext | 0~255字符 | 小型长度 | |
blob/text | 0~65535字符 | 正常长度 | |
mediumblob/mediumtext | 0~16777215字符 | 中等长度 | |
longblob/longtext | 0-4294967295字符 | 极大长度 | |
json | 受限于max_allowed_packet | 需要5.7+版本 | |
timestamp | 4B | CURRENT_TIMESTAMP,1970~2038 | 保存1970-01-01 00:00:00以来的秒数,同unix时间戳。 |
datetime | 8B | 1001~9999 | 精度为秒 |
四. 字段操作
4.1 增
1
2
3
|
ALTER
TABLE
my_table
ADD
COLUMN
status tinyint(4)
NOT
NULL
DEFAULT
'0'
;
ALTER
TABLE
my_table
ADD
COLUMN
my_field
VARCHAR
(30)
NOT
NULL
DEFAULT
''
AFTER
id;
ALTER
TABLE
my_table
ADD
COLUMN
age
int
(11) COMMENT
'年龄'
;
|
4.2 删
1
|
alert
TABLE
my_table
DROP
COLUMN
my_field;
|
4.3 改
1
2
3
|
ALTER
TABLE
my_table CHANGE my_field my_field_new
VARCHAR
(50);
ALTER
TABLE
my_table
MODIFY
COLUMN
my_field
INT
(11)
NOT
NULL
DEFAULT
'0'
;
ALTER
TABLE
my_table
ALTER
COLUMN
my_field
SET
DEFAULT
5;
|
4.3.1 ALTER
ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
设置或删除列的默认值。该操作会直接修改.frm文件而不涉及表数据。所以,这个操作非常快。
1
2
|
alter
table
film
alter
column
rental_duration
set
default
5;
alter
table
film
alter
column
rental_duration
drop
default
;
|
4.3.2 CHANGE
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
列的重命名、列类型的变更以及列位置的移动
1
2
|
ALTER
TABLE
MyTable CHANGE
COLUMN
foo bar
VARCHAR
(32)
NOT
NULL
FIRST
;
ALTER
TABLE
MyTable CHANGE
COLUMN
foo bar
VARCHAR
(32)
NOT
NULL
AFTER
baz;
|
4.3.3 MODIFY
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
除了列的重命名之外,他干的活和CHANGE COLUMN是一样的
1
|
ALTER
TABLE
MyTable
MODIFY
COLUMN
foo
VARCHAR
(32)
NOT
NULL
AFTER
baz;
|
4.3.4 总结
- change可以更改字段名,而modify/alter不能;
- 所有的MODIFY COLUMN/CHANGE COLUMN操作都将导致表重建;而ALTER COLUMN操作会修改.frm文件而不涉及表数据。
4.4 调整
1
|
ALTER
TABLE
my_table CHANGE my_field my_field
VARCHAR
(30)
NOT
NULL
DEFAULT
''
AFTER
id;
|
使用change,保持原属性。
五. 基本操作
5.1 增
1
2
3
4
5
6
7
|
INSERT
INTO
my_table (id, keyword)
VALUES
(1,
'keyword'
);
INSERT
INTO
my_table (field1,field2)
SELECT
field1,field2
FROM
other_table;
//批量插入时有字节限制,max_allowed_packet,一般为1MB
INSERT
LOW_PRIORITY
INTO
t_keywords (id, keyword)
VALUES
(1,
'a'
), (2,
'b'
)
INSERT
IGNORE
INTO
my_table (a,b,c)
VALUES
(1,2,3),(4,5,6);
REPLACE
INTO
my_table (keyword, insert_time)
VALUES
(
'a1'
, now())//删除冲突的旧记录,增加新记录
|
5.2 删
1
2
3
4
5
|
DELETE
FROM
my_table
WHERE
id = 1;
DELETE
FROM
my_table
WHERE
create_time < date_sub(now(), INTERVAL 3
MONTH
);
DELETE
FROM
t_keywords;
TRUNCATE
t_keywords;//删除所有数据,上边的逐行删除,下边的更高效,而且自增键会重置。
|
5.3 改
1
2
3
4
5
|
UPDATE
t_keywords
SET
keyword =
'test'
WHERE
id = 5
UPDATE
t_keywords
SET
keyword =
'test'
,
name
=
"du"
WHERE
id = 5
INSERT
INTO
my_table (a,b,c)
VALUES
(1,2,3)
ON
DUPLICATE
KEY
UPDATE
b=2,c=3;
INSERT
INTO
my_table (a,b,c)
VALUES
(1,2,3),(4,5,6)
ON
DUPLICATE
KEY
UPDATE
c=c+
VALUES
(c);
|
5.4 查
1
2
3
4
5
6
7
|
SELECT
id, keyword
FROM
t_keywords
WHERE
id = 5
AND
count
> 10 LIMIT 3, 5
SELECT
id, keyword
FROM
t_keywords
WHERE
id
BETWEEN
1
AND
5
SELECT
DISTINCT
id
FROM
t_keywords
SELECT
DISTINCT
id
FROM
t_keywords
ORDER
BY
id,
count
DESC
SELECT
SQL_NO_CACHE/SQL_CACHE *
FROM
t_keywords
WHERE
id = 5;//明确是否缓存
SELECT
*
FROM
my_table
WHERE
id >=(
SELECT
floor(RAND() * (
SELECT
MAX
(id)
FROM
my_table)) )
ORDER
BY
id LIMIT 5; //随机取值
SELECT
*
FROM
my_table
WHERE
id >=(
SELECT
floor(RAND() * ((
SELECT
MAX
(id)
FROM
my_table)-(
SELECT
MIN
(id)
FROM
my_table)) + (
SELECT
MIN
(id)
FROM
my_table)))
ORDER
BY
id LIMIT 5; //随机取值
|
5.4.1 where子句
- 逻辑操作符:and、or (and优先级高于or)
- 关系操作符:=、!=、<>、<、<=、>、>=、BETWEEN、is、not、in
- 通配符(与like搭配使用):%(任意字符任意次)、_(任意字符单次)
六. 索引
6.1 查看
1
|
SHOW
INDEX
FROM
my_table;
|
6.2 创建单个索引
1
2
|
ALTER
TABLE
t_keywords
ADD
INDEX
idx_keyword (keyword);
CREATE
INDEX
idx_keyword
ON
t_keywords (keyword);
|
6.3 创建联合索引
1
|
ALTER
TABLE
t_keywords
ADD
INDEX
idx_keyword_time (keyword,
time
);
|
6.4 创建前缀索引
1
|
ALTER
TABLE
t_keywords
ADD
INDEX
idx_keyword (keyword(5));
|
6.5 扩展索引
1
|
ALTER
TABLE
t_keywords
DROP
INDEX
idx_keyword
ADD
INDEX
idx_keyword_create_time (keyword, create_time);
|
6.6 删除
1
|
ALTER
TABLE
t_keywords
DROP
INDEX
idx_keyword;
|
七. 外键
7.1 创建
1
|
ALTER
TABLE
my_table
ADD
CONSTRAINT
fk_userId
FOREIGN
KEY
(my_user_id)
REFERENCES
other_table (other_user_id);
|
7.2 删除
1
|
ALTER
TABLE
my_table
DROP
FOREIGN
KEY
fk_name;
|
八、存储引擎
8.1 修改
1
|
ALTER
TABLE
my_table ENGINE=INNODB;
|