mysql数据库规范及关键字

一、数据库规范

所有规范会按照【高危】、【强制】、【建议】三个级别进行标注,遵守优先级从高到底。

1 设计规范

1.1 建库规范
  1. 【强制】:库的名称必须控制在32个字符以内

  2. 【建议】:库的名称格式:业务系统名称_子系统(模块)名

  3. 【建议】:一般分库名称命名格式是 库通配名_编号 库通配名_时间

  4. 【建议】:创建数据库时可显式指定字符集,只能使用 utf8 或 utf8mb4 格式,数据库默认字符集为 utf8

1.2 建表规范
1.2.1 整体结构限制
  1. 【强制】:表名称必须控制在32个字符以内,表名只能使用字母、数字和下划线
  2. 【建议】:表名建议全部使用小写字符
  3. 【建议】:单独同一模块的表名建议使用相同字符作为前缀区分
  4. 【强制】:不允许创建分区表
  5. 【强制】:无特殊需求,所有表的存储引擎默认都为 InnoDB。如果需要使用其他存储引擎,必须通过开发负责人和DBA审核之后才可以使用
  6. 【建议】:创建表时可显式指定字符集,只能使用 utf8 或 utf8mb4格式,表默认字符集为 utf8
  7. 【强制】:建表必须有 comment 注释信息
  8. 【建议】:使用临时表或中间表时,建议以tmp_bak_、日期等作为表名前缀或后缀区分
1.2.2 列限制
  1. 【强制】:建表SQL列名不能设置为 MySQL关键字
  2. 【建议】:建表SQL列名使用小写字符
  3. 【强制】:建表SQL中自增列必须设置为 intbigint类型,并且只能有一列自增列
  4. 【建议】:自增列初始值建议设置为1
  5. 【建议】:对核心表及配置记录表等建议设置数据创建时间、更新时间字段
  6. 【建议】:表中所有字段都需要设置默认值,并不能使用 NULL值,避免出现聚合计算偏差
  7. 【建议】:不推荐使用 enumset类型,不利于后续枚举值变更,推荐使用tinyintint类型
  8. 【强制】:所有字段都必须设置 comment 注释信息
1.2.3 索引限制
  1. 【强制】:建表SQL必须有且只有一个主键,类型为intbigint,主键最多只能指定一个字段

  2. 【建议】:表主键建议设置为自增,避免随机主键写入引起的性能下降

  3. 【强制】:不允许创建外键,同步更新需通过业务逻辑程序实现

  4. 【建议】:单个索引中每个索引记录的长度不能超过64KB

  5. 【强制】:唯一索引以uk_uq_开头,普通索引以idx_开头,以字段名称或缩写作为后缀

  6. 【建议】:单个表上的索引个数不能超过 5 个

  7. 【建议】:在建立索引时,多考虑建立联合索引,并把区分度最高的字段放在最前面

  8. 【建议】:在多表 join 的 SQL 里,保证被驱动表的连接列上有索引,这样 join 执行效率最高

  9. 【建议】:建表时,保证表里互相不存在冗余索引

1.3 改表规范
1.3.1 整体结构限制
  1. 【强制】:禁止修改表的存储引擎类型

  2. 【强制】:同个表的改表语句需合并在一条 SQL 中,避免多次改表影响性能

  3. 【高危】:禁止提交 DROP、TRUNCATE、RENAME 等高危工单

  4. 【建议】:对于超过 100W 的表结构修改,尽量发起定时执行工单,在低峰期处理

1.3.2 列限制
  1. 【强制】:禁止添加或修改字段名为 MySQL关键字
  2. 【建议】:建议添加或修改字段名称全部使用小写字符
  3. 【强制】:禁止删除字段
  4. 【强制】:禁止缩短字段长度
  5. 【强制】:禁止修改字段类型,比如int转为varchar类型等
  6. 【强制】:新增自增字段时,类型必须为intbigint
1.3.3 索引限制
  1. 【建议】:单个索引中每个索引记录的长度不能超过64KB

  2. 【强制】:唯一索引以uk_uq_开头,普通索引以idx_开头,以字段名称或缩写作为后缀

  3. 【建议】:单个表上的索引个数不能超过 5 个

  4. 【建议】:在建立索引时,多考虑建立联合索引,并把区分度最高的字段放在最前面

  5. 【建议】:在多表 join 的SQL里,保证被驱动表的连接列上有索引,这样 join 执行效率最高

  6. 【建议】:添加或删除索引时,保证表里互相不存在冗余索引

2 使用规范

2.1 DML语句
2.1.1 insert语句
  1. 【强制】:insert 语句指定具体字段名称

  2. 【强制】:insert 语句中禁止使用select *语法

  3. 【强制】:insert 语句中使用select语法时必须指定 where 条件

  4. 【建议】:insert into…values(XX),(XX),(XX)…。这里 XX 的值不要超过 5000 个,避免引起数据库主从延迟

  5. 【建议】:对于有auto_increment属性字段的表的插入操作,并发需要控制在 200 以内

2.1.2 delete语句
  1. 【强制】:delete 删除数据时需指定 where 条件

  2. 【建议】:删除数据时尽量使用主键或其他索引列作为限制条件,避免全表扫描

  3. 【高危】:禁用delete t1 … where a=XX limit XX; 这种带 limit 的删除语句。因为会导致主从不一致,导致数据错乱

  4. 【建议】:批量操作数据时,需要控制事务处理间隔时间,进行必要的 sleep,一般建议值 5-10 秒

  5. 【建议】:大批量数据删除时建议提交数据归档工单申请

2.1.3 update语句
  1. 【强制】:update 更新数据时需指定 where 条件

  2. 【建议】:更新数据时尽量使用主键或其他索引列作为限制条件,避免全表扫描

  3. 【高危】:禁用update t1 … where a=XX limit XX; 这种带 limit 的更新语句。因为会导致主从不一致,导致数据错乱

  4. 【高危】:update 禁止使用关联子查询,如update t1 set … where name in(select name from user where…); 效率极其低下

  5. 【强制】:禁止在业务的更新类 SQL 语句中使用 join

2.2 查询语句
  1. 【强制】:select 语句必须指定具体字段名称,禁止写为select *

  2. 【建议】:select 查询时建议使用索引字段作为限制条件,并且查询数据量不要超过全表的25%,确保查询使用到合适索引

  3. 【强制】:where 条件里等号左右字段类型必须一致,否则无法利用索引

  4. 【强制】:WHERE 子句中禁止只使用全模糊的 LIKE 条件进行查找,必须有其他等值或范围查询条件,否则无法利用索引

  5. 【建议】:索引列不要使用函数或表达式,否则无法利用索引

  6. 【建议】:in 值列表限制在 500 以内,可以减少底层扫描,减轻数据库压力从而加速查询

  7. 【建议】:select语句尽量使用 union all 代替 union,并且关联子句个数限制在 5 个以内。因为 union all 不需要去重,节省数据库资源,提高性能

  8. 【建议】:减少使用 or 语句,可将 or 语句优化为 union,然后在各个 where 条件上建立索引

  9. 【建议】:分页查询,当 limit 起点较高时,可先用过滤条件进行过滤

  10. 【强制】:禁止跨 db 的 join 语句

  11. 【建议】:不建议使用子查询,建议将子查询 SQL 拆开结合程序多次查询,或使用 join 来代替子查询

  12. 【建议】:线上环境,多表 join 不要超过 3 个表

  13. 【建议】:多表连接查询推荐使用别名,且 SELECT 列表中要用别名引用字段,数据库.表格式

  14. 【建议】:在多表 join 中,尽量选取结果集较小的表作为驱动表,来 join 其他表

  15. 【建议】:减少使用order by,尽量在业务程序上排序,减少对机器 CPU 的性能损耗

  16. 【建议】:order bygroup bydistinct这些 SQL 尽量利用索引直接检索出排序好的数据。如where a=1 order by b可以利用key(a,b)

  17. 【建议】:包含了order bygroup bydistinct这些查询的语句,where 条件过滤出来的结果集请保持在 1000 行以内,否则 SQL 会很慢。

附录

附录1:MySQL索引失效的常见情况
  1. 最左前缀原则。例如:存在联合索引idx_a_b(a, b),查询条件使用where b = 1则无法使用索引
  2. LIKE 前置模糊查询。例如:col_name like '%test'col_name like '%test%'
  3. 索引列使用函数或存在计算。例如:存在索引idx_col(col),查询条件使用where left(col, 2) = 'te'
  4. 查询条件使用 is not null。设计表结构时尽量设置 not null约束
  5. 字段类型出现隐式转换。例如:存在字段test_colvarchar类型,查询时使用了where test_col = 1,隐式转为了int类型导致索引失效
  6. 条件中有 or 存在可能不会使用索引。例如:查询条件为where a = 'testa' or b = 'testb',存在索引idx_a(a),此时也不会使用索引,除非为b字段也添加索引
  7. 查询结果超过整体结果的25%或三分之一,或者表数据量比较少时,MySQL认为全表扫描代价更小,会导致索引失效
附录2:MySQL关键字列表

R 表示为 MySQL 预留关键字

关键字关键字关键字
ACCESSIBLE(R)ACCOUNTACTION
ADD(R)AFTERAGAINST
AGGREGATEALGORITHMALL(R)
ALTER(R)ALWAYSANALYSE
ANALYZE(R)AND(R)ANY
AS(R)ASC(R)ASCII
ASENSITIVE(R)ATAUTOEXTEND_SIZE
AUTO_INCREMENTAVGAVG_ROW_LENGTH
BACKUPBEFORE(R)BEGIN
BETWEEN(R)BIGINT(R)BINARY(R)
BINLOGBITBLOB(R)
BLOCKBOOLBOOLEAN
BOTH(R)BTREEBY(R)
BYTECACHECALL ®
CASCADE(R)CASCADEDCASE ®
CATALOG_NAMECHAINCHANGE ®
CHANGEDCHANNELCHAR ®
CHARACTER ®CHARSETCHECK ®
CHECKSUMCIPHERCLASS_ORIGIN
CLIENTCLOSECOALESCE
CODECOLLATE ®COLLATION
COLUMN ®COLUMNSCOLUMN_FORMAT
COLUMN_NAMECOMMENTCOMMIT
COMMITTEDCOMPACTCOMPLETION
COMPRESSEDCOMPRESSIONCONCURRENT
CONDITION ®CONNECTIONCONSISTENT
CONSTRAINT ®CONSTRAINT_CATALOGCONSTRAINT_NAME
CONSTRAINT_SCHEMACONTAINSCONTEXT
CONTINUE ®CONVERT ®CPU
CREATE ®CROSS ®CUBE
CURRENTCURRENT_DATE ®CURRENT_TIME ®
CURRENT_TIMESTAMP ®CURRENT_USER ®CURSOR ®
CURSOR_NAMEDATADATABASE ®
DATABASES ®DATAFILEDATE
DATETIMEDAYDAY_HOUR ®
DAY_MICROSECOND ®DAY_MINUTE ®DAY_SECOND ®
DEALLOCATEDEC ®DECIMAL ®
DECLARE ®DEFAULT ®DEFAULT_AUTH
DEFINERDELAYED ®DELAY_KEY_WRITE
DELETE ®DESC ®DESCRIBE ®
DES_KEY_FILEDETERMINISTIC ®DIAGNOSTICS
DIRECTORYDISABLEDISCARD
DISKDISTINCT ®DISTINCTROW ®
DIV ®DODOUBLE ®
DROP ®DUAL ®DUMPFILE
DUPLICATEDYNAMICEACH ®
ELSE ®ELSEIF ®ENABLE
ENCLOSED ®ENCRYPTIONEND
ENDSENGINEENGINES
ENUMERRORERRORS
ESCAPEESCAPED ®EVENT
EVENTSEVERYEXCHANGE
EXECUTEEXISTS ®EXIT ®
EXPANSIONEXPIREEXPLAIN ®
EXPORTEXTENDEDEXTENT_SIZE
FALSE ®FASTFAULTS
FETCH ®FIELDSFILE
FILE_BLOCK_SIZEFILTERFIRST
FIXEDFLOAT(R)FLOAT4(R)
FLOAT8(R)FLUSHFOLLOWS
FOR(R)FORCE(R)FOREIGN(R)
FORMATFOUNDFROM(R)
FULLFULLTEXT(R)FUNCTION
GENERALGENERATED(R)GEOMETRY
GEOMETRYCOLLECTIONGET(R)GET_FORMAT
GLOBALGRANT(R)GRANTS
GROUP(R)GROUP_REPLICATIONHANDLER
HASHHAVING(R)HELP
HIGH_PRIORITY(R)HOSTHOSTS
HOURHOUR_MICROSECOND(R)HOUR_MINUTE(R)
HOUR_SECOND(R)IDENTIFIEDIF(R)
IGNORE(R)IGNORE_SERVER_IDSIMPORT
IN(R)INDEX(R)INDEXES
INFILE(R)INITIAL_SIZEINNER(R)
INOUT(R)INSENSITIVE(R)INSERT(R)
INSERT_METHODINSTALLINSTANCE
INT(R)INT1(R)INT2(R)
INT3(R)INT4(R)INT8(R)
INTEGER(R)INTERVAL(R)INTO(R)
INVOKERIOIO_AFTER_GTIDS(R)
IO_BEFORE_GTIDS(R)IO_THREADIPC
IS(R)ISOLATIONISSUER
ITERATE(R)JOIN(R)JSON
KEY(R)KEYS(R)KEY_BLOCK_SIZE
KILL(R)LANGUAGELAST
LEADING(R)LEAVE ®LEAVES
LEFT ®LESSLEVEL
LIKE ®LIMIT ®LINEAR(R)
LINES(R)LINESTRINGLIST
LOAD(R)LOCALLOCALTIME(R)
LOCALTIMESTAMP(R)LOCK(R)LOCKS
LOGFILELOGSLONG(R)
LONGBLOB(R)LONGTEXT(R)LOOP(R)
LOW_PRIORITY(R)MASTERMASTER_AUTO_POSITION
MASTER_BIND(R)MASTER_CONNECT_RETRYMASTER_DELAY
MASTER_HEARTBEAT_PERIODMASTER_HOSTMASTER_LOG_FILE
MASTER_LOG_POSMASTER_PASSWORDMASTER_PORT
MASTER_RETRY_COUNTMASTER_SERVER_IDMASTER_SSL
MASTER_SSL_CAMASTER_SSL_CAPATHMASTER_SSL_CERT
MASTER_SSL_CIPHERMASTER_SSL_CRLMASTER_SSL_CRLPATH
MASTER_SSL_KEYMASTER_SSL_VERIFY_SERVER_CERT(R)MASTER_TLS_VERSION
MASTER_USERMATCH(R)MAXVALUE(R)
MAX_CONNECTIONS_PER_HOURMAX_QUERIES_PER_HOURMAX_ROWS
MAX_SIZEMAX_STATEMENT_TIMEMAX_UPDATES_PER_HOUR
MAX_USER_CONNECTIONSMEDIUMMEDIUMBLOB(R)
MEDIUMINT(R)MEDIUMTEXT(R)MEMORY
MERGEMESSAGE_TEXTMICROSECOND
MIDDLEINT(R)MIGRATEMINUTE
MINUTE_MICROSECOND(R)MINUTE_SECOND(R)MIN_ROWS
MOD(R)MODEMODIFIES(R)
MODIFYMONTHMULTILINESTRING
MULTIPOINTMULTIPOLYGONMUTEX
MYSQL_ERRNONAMENAMES
NATIONALNATURAL(R)NCHAR
NDBNDBCLUSTERNEVER
NEWNEXTNO
NODEGROUPNONBLOCKINGNONE
NOT(R)NO_WAITNO_WRITE_TO_BINLOG(R)
NULL(R)NUMBERNUMERIC(R)
NVARCHAROFFSETOLD_PASSWORD
ON(R)ONEONLY
OPENOPTIMIZE(R)OPTIMIZER_COSTS(R)
OPTION(R)OPTIONALLY(R)OPTIONS
OR(R)ORDER(R)OUT(R)
OUTER(R)OUTFILE(R)OWNER
PACK_KEYSPAGEPARSER
PARSE_GCOL_EXPRPARTIALPARTITION(R)
PARTITIONINGPARTITIONSPASSWORD
PHASEPLUGINPLUGINS
PLUGIN_DIRPOINTPOLYGON
PORTPRECEDESPRECISION(R)
PREPAREPRESERVEPREV
PRIMARY(R)PRIVILEGESPROCEDURE(R)
PROCESSLISTPROFILEPROFILES
PROXYPURGE(R)QUARTER
QUERYQUICKRANGE(R)
READ(R)READS(R)READ_ONLY
READ_WRITE(R)REAL(R)REBUILD
RECOVERREDOFILEREDO_BUFFER_SIZE
REDUNDANTREFERENCES(R)REGEXP(R)
RELAYRELAYLOGRELAY_LOG_FILE
RELAY_LOG_POSRELAY_THREADRELEASE(R)
RELOADREMOVERENAME(R)
REORGANIZEREPAIRREPEAT(R)
REPEATABLEREPLACE(R)REPLICATE_DO_DB
REPLICATE_DO_TABLEREPLICATE_IGNORE_DBREPLICATE_IGNORE_TABLE
REPLICATE_REWRITE_DBREPLICATE_WILD_DO_TABLEREPLICATE_WILD_IGNORE_TABLE
REPLICATIONREQUIRE(R)RESET
RESIGNAL(R)RESTORERESTRICT(R)
RESUMERETURN(R)RETURNED_SQLSTATE
RETURNSREVERSEREVOKE(R)
RIGHT(R)RLIKE(R)ROLLBACK
ROLLUPROTATEROUTINE
ROWROWSROW_COUNT
ROW_FORMATRTREESAVEPOINT
SCHEDULESCHEMA(R)SCHEMAS(R)
SCHEMA_NAMESECONDSECOND_MICROSECOND(R)
SECURITYSELECT(R)SENSITIVE(R)
SEPARATOR(R)SERIALSERIALIZABLE
SERVERSESSIONSET(R)
SHARESHOW(R)SHUTDOWN
SIGNAL(R)SIGNEDSIMPLE
SLAVESLOWSMALLINT(R)
SNAPSHOTSOCKETSOME
SONAMESOUNDSSOURCE
SPATIAL ®SPECIFIC ®SQL ®
SQLEXCEPTION ®SQLSTATE ®SQLWARNING ®
SQL_AFTER_GTIDSSQL_AFTER_MTS_GAPSSQL_BEFORE_GTIDS
SQL_BIG_RESULT(R)SQL_BUFFER_RESULTSQL_CACHE
SQL_CALC_FOUND_ROWS(R)SQL_NO_CACHESQL_SMALL_RESULT(R)
SQL_THREADSQL_TSI_DAYSQL_TSI_HOUR
SQL_TSI_MINUTESQL_TSI_MONTHSQL_TSI_QUARTER
SQL_TSI_SECONDSQL_TSI_WEEKSQL_TSI_YEAR
SSL(R)STACKEDSTART
STARTING(R)STARTSSTATS_AUTO_RECALC
STATS_PERSISTENTSTATS_SAMPLE_PAGESSTATUS
STOPSTORAGESTORED(R)
STRAIGHT_JOIN(R)STRINGSUBCLASS_ORIGIN
SUBJECTSUBPARTITIONSUBPARTITIONS
SUPERSUSPENDSWAPS
SWITCHESTABLE(R)TABLES
TABLESPACETABLE_CHECKSUMTABLE_NAME
TEMPORARYTEMPTABLETERMINATED(R)
TEXTTHANTHEN(R)
TIMETIMESTAMPTIMESTAMPADD
TIMESTAMPDIFFTINYBLOB(R)TINYINT(R)
TINYTEXT(R)TO(R)TRAILING(R)
TRANSACTIONTRIGGER ®TRIGGERS
TRUE ®TRUNCATETYPE
TYPESUNCOMMITTEDUNDEFINED
UNDO(R)UNDOFILEUNDO_BUFFER_SIZE
UNICODEUNINSTALLUNION(R)
UNIQUE(R)UNKNOWNUNLOCK(R)
UNSIGNED(R)UNTILUPDATE(R)
UPGRADEUSAGE(R)USE(R)
USERUSER_RESOURCESUSE_FRM
USING(R)UTC_DATE(R)UTC_TIME(R)
UTC_TIMESTAMP(R)VALIDATIONVALUE
VALUES(R)VARBINARY(R)VARCHAR(R)
VARCHARACTER(R)VARIABLESVARYING(R)
VIEWVIRTUAL(R)WAIT
WARNINGSWEEKWEIGHT_STRING
WHEN(R)WHERE(R)WHILE(R)
WITH(R)WITHOUTWORK
WRAPPERWRITE(R)X509
XAXIDXML
XOR(R)YEARYEAR_MONTH(R)
ZEROFILL(R)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修己xj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值