mysql表名下划线_1.命名规范1.库名、表名、字段名必须使⽤⼩写字母,并采⽤下划线分割。。。
1.命名规范
1.库名、表名、字段名必须使⽤⼩写字母,并采⽤下划线分割。
a)MySQL有配置参数lower_case_table_names,不可动态更改,linux系统默认为 0,即库表名以实际情况存储,⼤⼩写敏感。如果是1,以⼩写存储,⼤⼩写不敏感。如果是2,以实际情况存储,但以⼩写⽐较。
b)如果⼤⼩写混合使⽤,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。
c)字段名显⽰区分⼤⼩写,但实际使⽤⽤不区分,即不可以建⽴两个名字⼀样但⼤⼩写不⼀样的字段。
d)为了统⼀规范, 库名、表名、字段名使⽤⼩写字母。
2.库名、表名、字段名禁⽌超过32个字符。
库名、表名、字段名⽀持最多64个字符,但为了统⼀规范、易于辨识以及减少传输量,禁⽌超过32个字符。
3.使⽤INNODB存储引擎。
INNODB引擎是MySQL5.5版本以后的默认引擘,⽀持事务、⾏级锁,有更好的数据恢复能⼒、更好的并发性能,同时对多核、⼤内存、SSD等硬件⽀持更好,⽀持数据热备份等,因此INNODB相⽐MyISAM有明显优势。
4.库名、表名、字段名禁⽌使⽤MySQL保留字。
当库名、表名、字段名等属性含有保留字时,SQL语句必须⽤反引号引⽤属性名称,这将使得SQL语句书写、SHELL脚本中变量的转义等变得⾮⾮常复杂。
5.禁⽌使⽤分区表。
分区表对分区键有严格要求;分区表在表变⼤后,执⾏⾏DDL、SHARDING、单表恢复等都变得更加困难。因此禁⽌使⽤分区表,并建议业务端⼿动SHARDING。
6.建议使⽤UNSIGNED存储⾮负数值。
同样的字节数,⾮负存储的数值范围更⼤。如TINYINT有符号为 -128-127,⽆符号为0-255。
7.建议使⽤INT UNSIGNED存储IPV4。
⽤UNSINGED INT存储IP地址占⽤4字节,CHAR(15)则占⽤15字节。另外,计算机处理整数类型⽐字符串类型快。使⽤INT UNSIGNED ⽽不是CHAR(15)来存储IPV4地址,通过MySQL函数inet_ntoa和inet_aton来进⾏转化。IPv6地址⽬前没有转化函数,需要使⽤DECIMAL或两个BIGINT来存储。
例如:
mysql视图和存储过程SELECT INET_ATON('209.207.224.40'); 3520061480
SELECT INET_NTOA(3520061480); 209.207.224.40
8.强烈建议使⽤TINYINT来代替ENUM类型。
ENUM类型在需要修改或增加枚举值时,需要在线DDL,成本较⾼;ENUM列值如果含有数字类型,可能会引起默认值混淆。
9.使⽤VARBINARY存储⼤⼩写敏感的变长字符串或⼆进制内容。
VARBINARY默认区分⼤⼩写,没有字符集概念,速度快。
10.INT类型固定占⽤4字节存储
例如INT(4)仅代表显⽰字符宽度为4位,不代表存储长度。数值类型括号后⾯的数字只是表⽰宽度⽽跟存储范围没有关系,⽐如INT(3)默认显⽰3位,空格补齐,超出时正常显⽰,python、java客户端等不具备这个功能。
11.区分使⽤DATETIME和TIMESTAMP。
存储年使⽤YEAR类型。存储⽇期使⽤DATE类型。 存储时间(精确到秒)建议使⽤TIMESTAMP类型。
DATETIME和TIMESTAMP都是精确到秒,优先选择TIMESTAMP,因为TIMESTAMP只有4个字节,⽽DATETIME8个字节。同时TIMESTAMP具有⾃动赋值以及⾃⾃动更新的特性。注意:在5.5和之前的版本中,如果⼀个表中有多个timestamp列,那么最多只能有⼀列能具有⾃动更新功能。
如何使⽤TIMESTAMP的⾃动赋值属性?
a)⾃动初始化,⽽且⾃动更新:
column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP
b)只是⾃动初始化:
column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
c)⾃动更新,初始化的值为0:
column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
d)初始化的值为0:
column1 TIMESTAMP DEFAULT 0
12.所有字段均定义为NOT NULL。
a)对表的每⼀⾏,每个为NULL的列都需要额外的空间来标识。
b)B树索引时不会存储NULL值,所以如果索引字段可以为NULL,索引效率会下降。
c)建议⽤0、特殊值或空串代替NULL值。
MySQL使⽤技巧
1.将⼤字段、访问频率低的字段拆分到单独的表中存储,分离冷热数据。
有利于有效利⽤缓存,防⽌⽌读⼊⽆⽤的冷数据,较少磁盘IO,同时保证热数据常驻内存提⾼⾼缓存命中率。
2.禁⽌在数据库中存储明⽂密码。
采⽤加密字符串存储密码,并保证密码不可解密,同时采⽤随机字符串加盐保证密码安全。
3.表必须有主键,推荐使⽤UNSIGNED⾃增列作为主键。
表没有主键,INNODB会默认设置隐藏的主键列;没有主键的表在定位数据⾏的时候⾮常困难,也会降低基于⾏复制的效率。
4.禁⽌冗余索引。
索引是双刃剑,会增加维护负担,增⼤⼤IO压⼒。(a,b,c)、(a,b),后者为冗余索引。可以利⽤前缀索引来达到加速⽬的,减轻维护负担。
5.禁⽌重复索引。
primary key a;uniq index a;重复索引增加维护负担、占⽤磁盘空间,同时没有任何益处。
6.不在低基数列上建⽴索引,例如“性别”。
⼤部分场景下,低基数列上建⽴索引的精确查,相对于不建⽴索引的全表扫描没有任何优势,⽽且增
⼤了IO负担。
7.合理使⽤覆盖索引减少IO,避免排序。
覆盖索引能从索引中获取需要的所有字段,从⽽⽽避免回表进⾏⼆次查,节省IO。
INNODB存储引擎中,secondary index(⾮主键索引,⼜称为辅助索引、⼆级索引)没有直接存储⾏地址,⽽是存储主键值。
如果⽤户需要查询secondary index中所不包含的数据列,则需要先通过secondary index查到主键值,然后再通过主键查询到其他数据列,因此需要查询两次。覆盖索引则可以在⼀⼀个索引中获取所有需要的数据,因此效率较⾼。
例如SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主键,适当时候可以将索引添加为index(uid,email),以获得性能提升。
8.⽤IN代替OR。SQL语句中IN包含的值不应过多,应少于1000个。
IN是范围查,MySQL内部会对IN的列表值进⾏排序后查,⽐OR效率更⾼。
9.表字符集使⽤UTF8,必要时可申请使⽤UTF8MB4字符集。
a)UTF8字符集存储汉字占⽤3个字节,存储英⽂字符占⽤⼀个字节。
b)UTF8统⼀⽽且通⽤,不会出现转码出现乱码风险。
c)如果遇到EMOJ等表情符号的存储需求,可申请使⽤UTF8MB4字符集。
10.⽤UNION ALL代替UNION。
UNION ALL不需要对结果集再进⾏排序。
11.禁⽌使⽤order by rand()。
order by rand()会为表增加⼀个伪列,然后⽤rand()函数为每⼀⾏数据计算出rand()值,然后基于该⾏排序,这通常都会⽣成磁盘上的临时表,因此效率⾮常低。建议先使⽤rand()函数获得随机的主键值,然后通过主键获取数据。
12.建议使⽤合理的分页⽅式以提⾼分页效率。
假如有类似下⾯分页语句:
SELECT * FROM table ORDER BY TIME DESC LIMIT 10000,10;
这种分页⽅式会导致⼤量的io,因为MySQL使⽤的是提前读取策略。
推荐分页⽅式:
SELECT * FROM table WHERE TIME
SELECT * FROM table inner JOIN (SELECT id FROM table ORDER BY TIME LIMIT 10000,10) as t
USING(id)
13.SELECT只获取必要的字段,禁⽌⽌使⽤SELECT *。
减少⽹络带宽消耗;
能有效利⽤覆盖索引;
表结构变更对程序基本⽆影响。
14.SQL中避免出现now()、rand()、sysdate()、current_user()等不确定结果的函数。
语句级复制场景下,引起主从数据不⼀致;不确定值的函数,产⽣⽣的SQL语句⽆法利⽤QUERY CACHE。
15.采⽤合适的分库分表策略。例如千库⼗表、⼗库百表等。
采⽤合适的分库分表策略,有利于业务发展后期快速对数据库进⾏⽔平拆分,同时分库可以有效利⽤⽤MySQL的多线程复制特性。
16.减少与数据库交互次数,尽量采⽤批量SQL语句。
使⽤下⾯的语句来减少和db的交互次数:
a)INSERT ... ON DUPLICATE KEY UPDATE
b)REPLACE INTO
c)INSERT IGNORE
d)INSERT INTO VALUES()
17.拆分复杂SQL为多个⼩SQL,避免⼤事务。
简单的SQL容易使⽤⽤到MySQL的QUERY CACHE;减少锁表时间特别是MyISAM;可以使⽤多核 CPU。
18.对同⼀个表的多次alter操作必须合并为⼀次操作。
mysql对表的修改绝⼤部分操作都需要锁表并重建表,⽽锁表则会对线上业务造成影响。为减少这种影响,必须把对表的多次alter操作合并为⼀次操作。例如,要给表t增加⼀个字段b,同时给已有的字段aa建⽴索引,
通常的做法分为两步:
alter table t add column b varchar(10);
然后增加索引:
alter table t add index idx_aa(aa);
正确的做法是:
alter table t add column b varchar(10),add index idx_aa(aa);
19.避免使⽤存储过程、触发器、视图、⾃定义函数等。
这些⾼级特性有性能问题,以及未知BUG较多。业务逻辑放到数据库会造成数据库的DDL、SCALE OU
T、SHARDING等变得更加困难。
20.禁⽌有super权限的应⽤程序账号存在。
安全第⼀。super权限会导致read only失效,导致较多诡异问题⽽且很难追踪。
21.不要在MySQL数据库中存放业务逻辑。
数据库是有状态的服务,变更复杂⽽且速度慢,如果把业务逻辑放到数据库中,将会限制业务的快速发展。建议把业务逻辑提前,放到前端或中间逻辑层,⽽把数据库作为存储层,实现逻辑与存储的分离。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对脚本之家的⽀持。如果你想了解更多相关内容请查看下⾯相关链接

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。