1. 数据库要单一职责,表字段可根据查询情况可适当冗余

2. 库名要小写,表名要小写,字段名首字母大写;且命名不要中英文结合,最好统一英文命名

3. 单库表不易太多,一般不要超过300个表

4. 表字段要设置合适数据类型,数据量越大越能体现其意义,比如状态可以使用Emun, ip 使用INT 类型,另外tinyint(1byte) smallint(2byte) 占用空间小查询快,能用尽量用,字符类型能不用尽量不用.

5. 单表字段设计不易太多,超过25个可考虑分表.

6. 适当遵循三大范式,范式一确保表中字段的原子性不可再分,范式二确保表中字段都和主键为中心含义相关,即表要有主键,且其它字段要和主键相关;范式三确保表中字段都和主键直接相关而非间接相关

1. 一对一  通过主键关联表

2. 一对多  通过外键关联表

3.  多对多  通过建立主键联合表进行关联

1. 插入带查询条件时可使用 insert into select

2. Select、Where 、Having 、Group 中带查询条件可以使用case when then else end 搜索条件式语句

3. 行转列  可使用 case when then else end 语句

4. 聚合函数使用子查询可以通过join 连接替代

5. Exists 将多行数据看做一个整体

6. Group by 将集合分类,想象一个圆里面划分不通道块或小圆

7. 面向集合思想编写SQL,尤其是左关联,右关联,取差,取全

8. 使用自查询来解决查出重复行的问题,自查询是笛卡尔积

1. 聚簇索引 innerDB 引擎,一般为主键,索引树的 叶子节点包含数据行,如果主键不是索引,则叶子节点包含主键的引用,如果连主键都没有,则会生成一个rowid 作为主键

2. 非聚簇索引 myisam 引擎,索引树文件和数据文件是分开的,需要回行,索引指向磁盘上数据行的位置

3. 查看执行计划 explain select * from table  重点看是否应用了索引,查询的类型属于哪种,类型包括:type: system const eq_ref  ref range index all     从左到右性能说明性能越来越差

4. 慢查询日志开启,注意是数据库级别的,而且影响性能.生产环境在使用时再临时打开,默认应该关闭

SET GLOBAL slow_query_log=1

SET GLOBAL slow_query_log_file='D:\\B.log'

Select * from mysql.slowlog

5. 索引失效情况:条件字段是数值型,但却当作字符型,比如加了单引号;条件中有计算列;独立索引同时只能有效一个,所以不是索引越多就都能应用上;联合索引看是否应用了索引的一个技巧是看索引顺序和查询条件语句顺序是否一致

6. 索引是有序的,所以可以提高查询、排序、分组的速度

7. 必要的时候可以建立冗余索引

为什么要使用锁,因为存在并发问题,并发产生哪些问题,比如 幻读,不重复读,脏读

1. 幻读 :不同事务,事务1 查询出结果 未提交,事务2插入操作提交,事务1同时查出数据提交,但此时查询出数据行比第一次多一条数据.

2. 不可重复读:不同事务,事务一查询出结果,未提交,事务2更新操作提交,事务1同时查出数据提交,但此时查询出数据和第一此查出结果不同.

3. 脏读:对于更新或删除操作.

正式因为会出现以上并发问题,所以要设置隔离级别,当然隔离级别越高,性能越差.

另外使用锁来解决并发问题

1. 悲观锁   比如

select for update  (生产环境基本不再推荐使用)

2. 乐观锁

在表上增加

version 版本号,

select version from table

业务逻辑处理过程

Int row= Update table set t1=1 and version=v1

If(row>0)

更新成功

更新失败