唐汉文 等人,丁磊作序,网易公司技术部DBA组
- RDBMS(Relational Database Management System:关系数据库管理系统)
- 冗余:存储两倍数据,冗余可以使系统速度更快。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
- 视图
- 索引:查询速度快
- 存储过程和函数
外键必须是另一个表的主键吗?
不一定是主键,但必须是唯一性索引
主键约束和唯一性约束都是唯一性索引
插件式存储引擎是 MySQL 数据库最重要的特性之一,用户可以根据应用的需要选择如
何存储和索引数据、是否使用事务等
show variables like ‘table_type’;查看当前数据库的存储引擎
- MyISAM 非事务性引擎
- 当前云服务器数据库采用的是MyISAM存储引擎
- 又支持三种不同的存储格式,静态表、动态表、压缩表。 p122深入浅出
- .frm 存储表定义
- MYD 存储数据
- MYI 存储索引
- 优点:占用空间小,访问速度快;
- 缺点:不支持事务的完整性和并发性;
- 适用于:对事务完整性没有要求或者以 SELECT、INSERT 为主的应用
- InnoDB 事务性引擎
- 提供自动增长列,auto_increment
- 支持AUTO_INCREMENT,自增列必须是主键;
- 提供外键约束 对事务处理的能力很强
- 缺点:读写效率稍差,占用的数据空间相对较大
- 存储方式两种:
- 1/使用共享表空间存储
- .frm存表结构、数据和索引存在 innodb_data_home_dir 和 innodb_data_file_path 定义的表空间
- 2/使用多表空间存储
- 表结构仍然保存在.frm 文件中,但是每个表的数据和索引单独保存在.ibd 中
MEMORY存储引擎
- 一次性
- 处理速度很快
- 存在内存中
同一个数据库中可以使用多种存储引擎的表
CONSTRAINT约束
问题:
1452 - Cannot add or update a child row: a foreign key constraint fails (aeta
.#sql-8a3_5e_ibfk_1
FOREIGN KEY (TypeID
) REFERENCES ProbeType
(TypeID
))
发现问题了,写数据时,把ChannelID和TypeID写反了
导致Channel表中的TypeID有45678这样的值,不在ProbeType设定的表值中
即子表中有父表中不存在的数据
- 存储引擎是以表为单位的
- 有很多数据时,最好不要用ALTER改变表的存储引擎,可能会造成一些意料之外的影响。
MySQL修改默认存储引擎 mysql_convert_table_format工具
MySQL批量修改存储引擎之shell脚本篇
http://blog.163.com/yang_jianli/blog/static/161990006201010175122563/ MySQL MyISAM 表转换为InnoDB的方法 !!
https://holmesian.org/MySQL_to_InnoDB 批量修改Mysql表引擎为InnoDB的方法!!、
加上 default-storage-engine=innodb
加上这段之后,以后新增的数据表型态都即是 InnoDB,不然每次新增一次数据表,SQL 后面得加上 ENGINE=InnoDB;
mysql —user=root —password=123456 -e “show table status from aeta where Engine <> ‘InnoDB’\G”|grep Name|awk ‘{print “alter table “$2” engine=innodb;”;}’ >mysqlchange
alter table Channel engine=innodb;
DESC Command; 显示属性
CHNAGE 写两次文件名
MODIFY 一次
DESC:
alter:add、change、modify、drop(删除字段)、rename(修改表名)
alter table xp add column IMS int(4); 添加列
可以添加多列,但是不能用after、first等关键字
alter table xp change IMS ims char(5) after Length;改名改顺序(名字从IMS变成了ims)
alter table win modify ims char(5) after time;修改顺序
alter table District modify DistrictID smallint;//修改一个表的字段属性
- change 可以修改列名称,modify不行(两者都可以修改字段的数据类型)
- 不同的是change 要写两次列名
alter table Data engine=innodb;更改表的存储引擎
alter table Data drop primary key;//删除主键
alter table Data add primary key(Time,Terminal);//添加主键
DDL语句:数据定义语言 DDL DML DCL
DML语句:数据操纵语言
INSERT
UPDATE
DELETE 删除记录
SELECT 查询记录 distinct
ORDER BY [DESC/ASC] 默认升序
LIMIT P43
聚合操作:
GROUP BY,HAVING
select sum(Length),max(Length),min(Length) from win;
select from test where name in
(select name from test group by name having COUNT()>1)
表连接;
DROP table tableName 直接从当前数据库删这个表。
DELETE FROM tableName 删除表中的数据
子查询:
in 、not in
记录联合:Union Union All
DCL语句:数据控制语言
=====================================
MySQL支持的数据类型:
1、数字类型
AUTO_INCREMENT (一个表中最多一个这样的列)
2、日期时间
date
Time
DateTime
Timestamp(自动等于当前系统时间,一次表中最多一个这样的列)。
TimeStamp与DateTime的对比
3、字符串类型
CAHR() 检索时删除末尾的空格
VARCHAR 保留空格 insert into vc values(‘ab’,’ab’); 注意这里的单引号
BINARY
VARBINARY
枚举类型:ENUM:SET: p73
truncate(截断)与delete(删除)的区别:
1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。(即清空表相当于删除进回收站,截断表相当于彻底删除)
2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。
3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。
4、TRUNCATE不能触发任何DELETE触发器。
5、不能授予任何人清空他人的表的权限。
6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。
7、不能清空父表。
truncate table(截断表) 是清空一个表,是一个DDL语言,效率高。delete就DML语言;
delete时会触发与表相关的触发器,而truncate不会;delete可以有删除条件,truncate不行
第四章
MySQL中的运算符
可以利用select语句在SQL命令行中进行计算器、二进制、16进制转换等工作。
- 算术运算符
- 比较运算符: BETWEEN 、IN、通配符LIKE
- 逻辑运算符 NOT AND OR XOR(异或)
- 位运算符
第五章
常用函数 P87
字符串函数:
数值函数:
日期和时间函数
流程函数 IF IFNULL CASE WHEN
其他 MD5(str)
第八章 选择合适的数据类型
第10章 索引的设计和使用
索引:一种特殊的数据库结构
B型树索引(BTREE)和哈希索引(HASH)
- 可以提高查询的速度,但是会影响插入数据的速度
- 索引: 对于有依赖关系的子表和父表之间的联合查询,可以提高查询速度
- 索引分类:普通、唯一性UNIQUE、全文索引FULLTEXT、单列索引、多列索引、空间索引
- 索引的设计原则 P114 《入门很简单》
- 创建索引
- 1创建表时就创建索引
- 2在已经存在的表上创建索引 create index on tablename (字段名)
- 3用ALTER TABLE语句创建索引 alter table tablename add index 索引名(字段名)
- 删除索引 drop index 索引名 on 表名
唯一性索引:UNIQUE 主键就是一种特殊的唯一性索引
索引:建立索引以后,表中数据就按照索引的一定规则自动排列
主键:表中数据的唯一标识;建立主键时,系统就会自动建立一个唯一性索引
MyISAM 和InnoDB存储引擎表默认创建的都是BTREE索引
Memory存储引擎支持HASH和BTREE引擎,但默认是HASH引擎
设计索引的原则:
* 使用短索引 缓存可以存更多值
使用唯一索引
最适合来做索引的列: WHERE子句中的列
不要过度索引
MySql索引最左前缀原则
14.3 分布式事务的使用
还有有一定缺陷的
18章 SQL优化
准备好去补上去