5. 分库分表、分区表
- 【逼迫】分区表的分区字段(partition-key)必需有索引,大附崆组合索引的首列。
- 【逼迫】单个分区表中的分区(包罗子分区)个数不能高出1024。
- 【逼迫】上线前RD可能DBA必需指定分区表的建设、整理计策。
- 【逼迫】会见分区表的SQL必需包括分区键。
- 【提议】单个分区文件不高出2G,总巨细不高出50G。提议总分区数不高出20个。
- 【逼迫】对付分区表执行alter table操纵,必需在营业低峰期执行。
- 【逼迫】回收分库计策的,库的数目不能高出1024
- 【逼迫】回收分表计策的,表的数目不能高出4096
- 【提议】单个分表不高出500W行,ibd文件巨细不高出2G,这样才气让数据漫衍式变得机能更佳。
- 【提议】程度分表只管用取模方法,日记、报表类数据提议回收日期举办分表。
6. 字符集
- 【逼迫】数据库自己库、表、列全部字符集必需保持同等,为utf8或utf8mb4。
- 【逼迫】前端措施字符集可能情形变量中的字符集,与数据库、表的字符集必需同等,同一为utf8。
二、SQL编写类型

1. DML语句
- 【逼迫】SELECT语句必需指定详细字段名称,榨取写成*。由于select *会将不应读的数据也从MySQL里读出来,造成网卡压力。且表字段一旦更新,但model层没有来得及更新的话,体系会报错。
- 【逼迫】insert语句指定详细字段名称,不要写成insert into t1 values(…),原理同上。
- 【提议】insert into…values(XX),(XX),(XX)…。这里XX的值不要高出5000个。值过多固然上线很很快,但会引起主从同步耽误。
- 【提议】SELECT语句不要行使UNION,保举行使UNION ALL,而且UNION子句个数限定在5个以内。由于union all不必要去重,节减数据库资源,进步机能。
- 【提议】in值列表限定在500以内。譬喻select… where userid in(….500个以内…),这么做是为了镌汰底层扫描,减轻数据库压力从而加快查询。
- 【提议】事宜里批量更新数据必要节制数目,举办须要的sleep,做到少量多次。
- 【逼迫】事宜涉及的表必需所有是innodb表。不然一旦失败不会所有回滚,且易造成主从库同步终端。
- 【逼迫】写入和事宜发往主库,只读SQL发往从库。
- 【逼迫】除静态表或小表(100行以内),DML语句必需有where前提,且行使索引查找。
- 【逼迫】出产情形榨取行使hint,如sql_no_cache,force index,ignore key,straight join等。由于hint是用来逼迫SQL凭证某个执行打算来执行,但跟着数据量变革我们无法担保本身当初的预判是正确的,因此我们要信托MySQL优化器!
- 【逼迫】where前提里等号阁下字段范例必需同等,不然无法操作索引。
- 【提议】SELECT|UPDATE|DELETE|REPLACE要有WHERE子句,且WHERE子句的前提必须行使索引查找。
- 【逼迫】出产数据库中凶猛不保举大表上产生全表扫描,但对付100行以下的静态表可以全表扫描。查询数据量不要高出表行数的25%,不然不会操作索引。
- 【逼迫】WHERE 子句中榨取只行使全恍惚的LIKE前提举办查找,必需有其他等值或范畴查询前提,不然无法操作索引。
- 【提议】索引列不要行使函数或表达式,不然无法操作索引。如where length(name)='Admin'或where user_id+2=10023。
- 【提议】镌汰行使or语句,可将or语句优化为union,然后在各个where前提上成立索引。如where a=1 or b=2优化为where a=1… union …where b=2, key(a),key(b)。
- 【提议】分页查询,当limit出发点较高时,可先用过滤前提举办过滤。如select a,b,c from t1 limit 10000,20;优化为:select a,b,c from t1 where id>10000 limit 20;。
2. 多表毗连
- 【逼迫】榨取跨db的join语句。由于这样可以镌汰模块间耦合,为数据库拆分奠基坚硬基本。
- 【逼迫】榨取在营业的更新类SQL语句中行使join,好比update t1 join t2…。
- 【提议】不提议行使子查询,提议将子查询SQL拆开团结措施多次查询,或行使join来取代子查询。
- 【提议】线上情形,多表join不要高出3个表。
- 【提议】多表毗连查询保举行使别名,且SELECT列表中要用别名引用字段,数据库.表名目,如select a from db1.table1 alias1 where …。
- 【提议】在多表join中,只管选取功效集较小的表作为驱动表,来join其他表。
3. 事宜
- 【提议】事宜中INSERT|UPDATE|DELETE|REPLACE语句操纵的行数节制在2000以内,以及WHERE子句中IN列表的传参个数节制在500以内。
- 【提议】批量操纵数据时,必要节制事宜处理赏罚隔断时刻,举办须要的sleep,一样平常提议值5-10秒。
- 【提议】对付有auto_increment属性字段的表的插入操纵,并发必要节制在200以内。
- 【逼迫】措施计划必需思量“数据库事宜断绝级别”带来的影响,包罗脏读、不行一再读和幻读。线上提议事宜断绝级别为repeatable-read。
- 【提议】事宜里包括SQL不高出5个(付出营业除外)。由于过长的事宜会导致锁数据较久,MySQL内部缓存、毗连耗损过多等雪崩题目。
- 【提议】事宜里更新语句只管基于主键或unique key,如update … where id=XX; 不然会发生间隙锁,内部扩大锁定范畴,导致体系机能降落,产存亡锁。
- 【提议】只管把一些典范外部挪用移失事宜,如挪用webservice,会见文件存储等,从而停止事宜过长。
- 【提议】对付MySQL主从耽误严酷敏感的select语句,请开启事宜逼迫会见主库。
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|