唐汉文 等人,丁磊作序,网易公司技术部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., CONSTRAINT #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引擎
    设计索引的原则:
    * 使用短索引 缓存可以存更多值

    1. 使用唯一索引

    最适合来做索引的列: WHERE子句中的列

    1. 不要过度索引

    MySql索引最左前缀原则
    14.3 分布式事务的使用
    还有有一定缺陷的
    18章 SQL优化
    准备好去补上去