在开发中,虽然性能大多决定于架构设计,但是合理的使用sql语句,是开发人员的必修课,今天基于mysql官方文档,给大家整理一些mysql的规定。
规范依据约束力强弱及故障敏感性依次分为【强制】、【推荐】、【参考】三大类。
约束度:【强制】
规范描述:
CREATE TABLE `table_exp` ( `id` bigint unsigned AUTO_INCREMENT NOT NULL COMMENT '主键ID', `package_id` int unsigned NOT NULL DEFAULT 0 COMMENT '套系id', `module_id` int unsigned NOT NULL DEFAULT 0 COMMENT '模块id', `module_name` varchar(64) NOT NULL DEFAULT '' COMMENT '模块名称', `is_delete` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '是否删除,0-未删除,1-删除,默认为0', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), KEY idx_package_id(package_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='模块示例表'; _tmp_8位日期 结尾,如:order_tmp_20160712_bak_8位日期 结尾,如:order_bak_20160712CREATE DATABASE IF NOT EXISTS my_database DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_bin; 约束度:【强制**
规范描述:
`price` DECIMAL(10,2) NOT NULL; 约束度:【强制】【推荐】
规范描述:
`status` TINYINT UNSIGNED NOT NULL COMMENT '1: 启用,0: 禁用'; 约束度:【强制】【推荐】
规范描述:
`is_active` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '1: 启用,0: 禁用'; uk_[字段名] 来命名;idx_[字段名] 来命名。count(distinct left(col_name,n))/count(1) 来计算,达到 90% 即可。LAST_INSERT_ID() 函数只能返回当前 SESSION 最近一次 INSERT 操作之后所使用到的 AUTO_INCREMENT 类型字段的值。IN() / UNION 替代 OR,并注意 IN 的个数不要超过 300,IN 的性能高于 OR,而 EXISTS / NOT EXISTS 比 IN / NOT IN 性能更优。PREPARED STATEMENT 可以提高性能并避免 SQL 注入。LOCK TABLE 进行人为锁表,仅允许使用 SELECT ... FOR UPDATE 语句。IN、BETWEEN,<,<=,>,>= 会导致后面的条件使用不了索引。UNION ALL 代替 UNION。UPDATE、DELETE 语句不要使用 LIMIT。INSERT ... ON DUPLICATE KEY UPDATEINSERT IGNOREINSERT INTO VALUES()REPLACE INTOmonth(create_time)=1 或 where num+1=100。IS NULL 或 IS NOT NULL。LIKE '%keywork%'。此类业务推荐使用搜索引擎或者全文索引。ORDER BY 语句必须跟 LIMIT n 限制条件。ORDER BY。SELECT *,必须指定列名。SELECT column1, column2 FROM table_name; INNER JOIN(JOIN) ... ON ..,外连接必须使用 LEFT JOIN(LEFT OUTER JOIN) ... ON。不使用 RIGHT JOIN。INSERT INTO table 必须指定列名与值的对应关系。lshm_admin_v1.0.0.0_liaozr_20201121_001.sql 为初始全量 SQL 脚本,下一个 SQL 脚本为差异 SQL 脚本,按版本号顺序依次迭代。因为 MySQL 是索引组织表,所以常规情况下,操作 MySQL 的表都是根据索引进行的,即使全表扫描,也是如此。索引通常用 B+树 来实现。
数据只保存在绿色的叶子结点,非叶子结点都是用来索引叶子结点的。 假设索引高度为 h,那么每次索引查询都要查询 h 个索引页面才能找到叶子结点的索引数据。 假设每行记录大小为 1KB,则每个叶子页面可以容纳 16 行,则总共可索引的行数为100W*16=1600W! 在高度 h=4 时,总行数=1000^3*16=160亿条! 对于 bigint 的主键表来说,通常索引树的高度在 2~4 个。
索引字段的数据类型越简单,效率越好。例如:int 或 tinyint,索引效率会更好,而 varchar(40) 等类型的扇出系数就低一些,所以索引效率也会低些。