MySQL开发规范

索引规范

索引数量

(1) 单张表中索引数量不超过5个(建议3个左右),如果超时,一般情况下表能够进行二次拆分。

(2) 单个索引中的字段数不超过5个(建议3个以内)。

(3) 对字符串使⽤用前缀索引。

(4) 建议优先考虑前缀索引,必要时可添加伪列并建立索引。

主键准则

(1) 表必须有主键。

(2) 不使用更新频繁的列作为主键。

(3) 尽量不选择字符串列作为主键。

(4) 不允许UUID MD5 HASH这些作为主键。

(5) 默认使⽤非空的唯一键作为主键。

(6) 建议选择自增。

优先准则

(1) 频繁SQL:对最频繁的SQL必须要添加索引。

(2) 更新SQL:UPDATE、DELETE语句的WHERE条件列需要添加索引,否则每次更新就是表锁。

(3) 排序SQL:ORDER BY、GROUP BY、DISTINCT的字段。充分利用索引先天顺序避免排序,否则会消耗大量磁盘IO。

(4) 核⼼SQL:优先考虑使用覆盖索引。

一般准则

(1) 区分度最大的字段放在前面。

(2) 避免冗余和重复索引。

(3) 索引要综合评估数据密度和分布以及考虑查询和更新比例。

(4) 索引命名:非唯一索引必须以 idx_字段1_字段2命名,唯一索引必须以uniq_字段1_字段2命名,索引名称必须全部小写。

(5) 新建的唯一索引必须不能和主键重复。

(6) 索引字段的默认值不能为NULL,要改为其他的default或者空。NULL非常影响索引的查询效率。

(7) 反复查看与表相关的SQL,符合最左前缀的特点建立索引。多条字段重复的语句,要修改语句条件字段的顺序,为其建立一条联合索引,减少索引数量。

(8) 能使用唯一索引就要使用唯一索引,提高查询效率。

(9) 使用EXPLAIN判断SQL语句是否合理使用索引,尽量避免extra列出现:Using File Sort,Using Temporary。

(10) SQL变更需要确认索引是否需要变更并通知DBA。

索引禁忌

(1) 不在低基数列上建立索引,例如“性别”。

(2) 不在索引列进行数学运算和函数运算。

(3) 如果有外键,外键一定要创建索引。

SQL规范

SQL禁忌

(1) 禁止使用大事务。整个事务要简单,执行时间不能太长。

(2) 禁止使用触发器、函数、存储过程。

(3) 禁止在数据库中进⾏数学运算。

(4) 禁止对大表进行JOIN。

(5) 禁止一次更新太多数据。一般不超过10行。

(6) 禁止在线上提供访问的数据库中跑大查询。如果需要,请联系DBA。

(7) 禁止使⽤order by rand()。

(8) 禁⽌单条SQL语句同时更新多个表。

一般规范

(1) SQL语句尽可能简单,尽力避免使用JOIN。

(2) 降低业务耦合度,为scale out、sharding留有余地。

(3) 不要用select *,查询哪几个字段就select 这几个字段。

(4) limit分页注意效率。Limit越大,效率越低。可以改写limit,比如例子改写:eg:select id from tlimit 10000, 10;  =>  select id from t where id > 10000 limit10;

SELECT * FROM table ORDER BY TIME DESC LIMIT 10000,10;=》 SELECT * FROM table WHERE TIME<last_TIME ORDER BY TIME DESC LIMIT 10.

                                                                                                         =》 SELECT * FROM table inner JOIN(SELECT id FROM table ORDER BY TIME LIMIT 10000,10) as t USING(id)

(5) 使用union all替代union。

(6) 减少与数据库的交互次数。

(7) 注意使用性能分析工具explain、show profile。

(8) SQL语句不可以出现隐式转换,比如 select id from 表 where id='1'。

(9) IN条件里面的数据数量要少。

(10) 能不用NOT IN就不用NOT IN,会把空和NULL给查出来。

(11) 在SQL语句中,禁止使用前缀是%的like。

(12) 不使用负向查询,如not in、like。

(13) 关于分页查询:程序里建议合理使用分页来提高效率limit,offset较大要配合子查询使用。

(14) 使⽤预编译语句,只传参数,比传递SQL语句更高效;一次解析,多次使用;降低SQL注入概率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值