前往顾页
以后地位: 主页 > 收集编程 > Php实例教程 >

MySQL开辟标准和准绳年夜全

时候:2013-04-21 22:00来源:知行网www.zhixing123.cn 编辑:麦田守望者

一、 表设想

  1. 库名、表名、字段名必须利用小写字母,“_”豆割。
  2. 库名、表名、字段名必须不超越12个字符。
  3. 库名、表名、字段名见名知意,建议利用名词而不是动词。
  4. 建议利用InnoDB存储引擎。
  5. 存储切确浮点数必须利用DECIMAL替代FLOAT和DOUBLE。
  6. 建议利用UNSIGNED存储非正数值。
  7. 建议利用INT UNSIGNED存储IPV4。
  8. 整形定义中不增加长度,比如利用INT,而不是INT(4)。
  9. 利用短数据范例,比如取值范围为0-80时,利用TINYINT UNSIGNED。
  10. 不建议利用ENUM范例,利用TINYINT来代替。
  11. 尽可能不利用TEXT、BLOB范例。
  12. VARCHAR(N),N表示的是字符数不是字节数,比如VARCHAR(255),可以最年夜可存储255个汉字,需求按照实际的宽度来挑选N。
  13. VARCHAR(N),N尽可能小,因为MySQL一个表中所有的VARCHAR字段最年夜长度是65535个字节,进行排序和建立临时表一类的内存操纵时,会利用N的长度请求内存。
  14. 表字符集挑选UTF8。
  15. 利用VARBINARY存储变长字符串。
  16. 存储年利用YEAR范例。
  17. 存储日期利用DATE范例。
  18. 存储时候(切确到秒)建议利用TIMESTAMP范例,因为TIMESTAMP利用4字节,DATETIME利用8个字节。
  19. 建议字段定义为NOT NULL。
  20. 将过年夜字段拆分到其他表中。
  21. 避免在数据库中利用VARBINARY、BLOB存储图片、文件等。
  22. 表布局变动需哀告诉DBA考核。

2、 索引

  1. 非独一索引必须遵循“idx_字段称呼_字段称呼[_字段名]”进行定名。
  2. 独一索引必须遵循“uniq_字段称呼_字段称呼[_字段名]”进行定名。
  3. 索引称呼必须利用小写。
  4. 索引中的字段数建议不超越5个。
  5. 单张表的索引数量节制在5个以内。
  6. 独一键由3个以下字段构成,并且字段都是整形时,利用独一键作为主键。
  7. 没有独一键或独一键不适合5中的前提时,利用自增(或经由过程发号器获得)id作为主键。
  8. 独一键反面主键反复。
  9. 索引字段的依次需求考虑字段值去重以后的个数,个数多的放在前面。
  10. ORDER BY,GROUP BY,DISTINCT的字段需求增加在索引的前面。
  11. 利用EXPLAIN判定SQL语句是不是公道利用索引,尽可能避免extra列呈现:Using File Sort,Using Temporary。
  12. UPDATE、DELETE语句需求按照WHERE前提增加索引。
  13. 不建议利用%前缀恍惚查询,比方LIKE “%weibo”。
  14. 对长度太长的VARCHAR字段建立索引时,增加crc32或MD5 Hash字段,对Hash字段建立索引。
  15. 公道建立结合索引(避免冗余),(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)。
  16. 公道操纵覆盖索引。
  17. SQL变动需求确认索引是不是需求变动并告诉DBA。

3、 SQL语句

  1. 利用prepared statement,可以供应机能并且避免SQL注入。
  2. SQL语句中IN包含的值不该过量。
  3. UPDATE、DELETE语句不利用LIMIT。
  4. WHERE前提中必须利用适合的范例,避免MySQL进行隐式范例转化。
  5. SELECT语句只获得需求的字段。
  6. SELECT、INSERT语句必须显式的指明字段称呼,不利用SELECT *,不利用INSERT INTO table()。
  7. 使 用SELECT column_name1, column_name2 FROM table WHERE [condition]而不是SELECT column_name1 FROM table WHERE [condition]和SELECT column_name2 FROM table WHERE [condition]。
  8. WHERE前提中的非等值前提(IN、BETWEEN、<、<=、>、>=)会导致前面的前提利用不了索引。
  9. 避免在SQL语句进行数学运算或函数运算,容易将业务逻辑和DB耦合在一路。
  10. INSERT语句利用batch提交(INSERT INTO table VALUES(),(),()……),values的个数不该过量。
  11. 避免利用存储过程、触发器、函数等,容易将业务逻辑和DB耦合在一路,并且MySQL的存储过程、触发器、函数中存在必然的bug。
  12. 避免利用JOIN。
  13. 利用公道的SQL语句减少与数据库的交互次数。
  14. 不利用ORDER BY RAND(),利用其他体例替代。
  15. 建议利用公道的分页体例以进步分页的效力。
  16. 统计表中记录数时利用COUNT(*),而不是COUNT(primary_key)和COUNT(1)。
  17. 避免在从库上履行背景办理和统计范例服从的QUERY。

4、 散表

  1. 每张表数据量建议节制在5000w以下。
  2. 可以连络利用hash、range、lookup table进行散表。
  3. 散表如果利用md5(或近似的hash算法)进行散表,表名后缀利用16进制,比如user_ff。
  4. 保举利用CRC32求余(或近似的算术算法)进行散表,表名后缀利用数字,数字必须从0开端并等宽,比如散100张表,后缀从00-99。
  5. 利用时候散表,表名后缀必须利用特定格局,比如按日散表user_20110209、按月散表user_201102。

5、 其他

  1. 批量导入、导出数据需求DBA进行检查,并在履行过程中察看办事。
  2. 批量更新数据,如update,delete 操纵,需求DBA进行检查,并在履行过程中察看办事。
  3. 产品呈现非数据库平台运维导致的问题和毛病时,如前端被抓站,请及时告诉DBA,便于保护办事不变。
  4. 业务部分法度呈现bug等影响数据库办事的问题,请及时告诉DBA,便于保护办事不变。
  5. 业务部分奉行活动,请提前告诉DBA进行办事和拜候评价。
  6. 如果呈现业务部分报酬误操纵导致数据丧失,需求规双数据,请在第一时候告诉DBA,并供应精确时候,误操纵语句等首要线索。

————————————————————————————————————————————————————————————————————————————————————————————————

FAQ

1-1.库名、表名、字段名必须利用小写字母,“_”豆割。

a) MySQL有建设参数lower_case_table_names,不成静态变动,linux体系默许为0,即库表名以实际环境存储,年夜小写敏感。如果是1,以小写存储,年夜小写不敏感。如果是2,以实际环境存储,但以小写比较。

b) 如果年夜小写混合用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。

c) 字段名显现辨别年夜小写,但实际利用不辨别,即不成以建立两个名字一样但年夜小写不一样的字段。

d) 为了同一标准, 库名、表名、字段名利用小写字母。

1-2.库名、表名、字段名必须不超越12个字符。

库名、表名、字段名支撑最多64个字符,但为了同一标准、易于辨识和减少传输量,必须不超越12字符。

1-3.库名、表名、字段名见名知意,建议利用名词而不是动词。

a) 用户评论可用表名usercomment或comment。

b) 库表是一种客观存在的事物,一种工具,所以建议利用名词。

1-4.建议利用InnoDB存储引擎。

a) 5.5今后的默许引擘,支撑事件,行级锁,更好的规复性,高并发下机能更好,对多核,年夜内存,ssd等硬件支撑更好。

b) 详细比较可见附件的官方白皮书。

1-5.存储切确浮点数必须利用DECIMAL替代FLOAT和DOUBLE。

a) mysql中的数值范例(不包含整型):
IEEE754浮点数: float (单精度) , double 或 real (双精度)
定点数: decimal 或 numeric
单精度浮点数的有效数字二进制是24位,按十进制来讲,是8位;双精度浮点数的有效数字二进制是53位,按十进制来讲,是16 位
一个实数的有效数字超越8位,用单精度浮点数来表示的话,就会产生偏差!一样,如果一个实数的有效数字超越16位,用双精度浮点数来表示,也会产生偏差
b) IEEE754标准的计较机浮点数,在外部是用二进制表示的,但在将一个十进制数转换为二进制浮点数时,也会造成偏差,启事是不是是所有的数都能转换成无限长度的二进制数。
即一个二进制可以精确转换成十进制,但一个带小数的十进制不必然可以或许精确地用二进制来表示。

实例:
drop table if exists t;

create table t(value float(10,2));

insert into t values(131072.67),(131072.68);

select value from t;

+———–+

| value |

+———–+

| 131072.67 |

| 131072.69 |

+———–+

1-6.建议利用UNSIGNED存储非正数值。

一样的字节数,存储的数值范围更年夜。如tinyint 有标记为 -128-127,无标记为0-255

1-7. 若何利用INT UNSIGNED存储ip?

利用INT UNSIGNED而不是char(15)来存储ipv4地点,经由过程MySQL函数inet_ntoa和inet_aton来进行转化。Ipv6地点目前没有转化函数,需求利用DECIMAL或两个bigINT来存储。比方:

SELECT INET_ATON(‘209.207.224.40′);

3520061480

SELECT INET_NTOA(3520061480);

209.207.224.40

1-8. INT[M],M值代表甚么含义?

重视数值范例括号前面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默许显现3位,空格补齐,超出时一般显现,python、java客户端等不具有这个服从。

1-10.不建议利用ENUM、SET范例,利用TINYINT来代替。

顶一下
(0)
0%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):数据库 MYSQL mysql数据库
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣