建议使用自增列作为主键,如使用联合自增主键时请将自增键作为第一列
- Content:建议使用自增列作为主键,如使用联合自增主键时请将自增键作为第一列
- Case:
create table test(`id` int(11) NOT NULL PRIMARY KEY (`id`))
无主键或唯一键,无法在线变更表结构
- Content:无主键或唯一键,无法在线变更表结构
- Case:
create table test(col varchar(5000))
避免外键等递归关系
- Content:存在递归关系的数据很常见,数据常会像树或者以层级方式组织。然而,创建一个外键约束来强制执行同一表中两列之间的关系,会导致笨拙的查询。树的每一层对应着另一个连接。您将需要发出递归查询,以获得节点的所有后代或所有祖先。解决方案是构造一个附加的闭包表。它记录了树中所有节点间的关系,而不仅仅是那些具有直接的父子关系。您也可以比较不同层次的数据设计:闭包表,路径枚举,嵌套集。然后根据应用程序的需要选择一个。
- Case:
CREATE TABLE tab2 (p_id BIGINT UNSIGNED NOT NULL,a_id BIGINT UNSIGNED NOT NULL,PRIMARY KEY (p_id, a_id),FOREIGN KEY (p_id) REFERENCES tab1(p_id),FOREIGN KEY (a_id) REFERENCES tab3(a_id))
提醒:请将索引属性顺序与查询对齐
- Content:如果为列创建复合索引,请确保查询属性与索引属性的顺序相同,以便DBMS在处理查询时使用索引。如果查询和索引属性订单没有对齐,那么DBMS可能无法在查询处理期间使用索引。
- Case:
create index idx1 on tbl (last_name,first_name)
表建的索引过多
CREATE TABLE tbl ( a int, b int, c int, KEY idx_a (`a`),KEY idx_b(`b`),KEY idx_c(`c`));
主键中的列过多
CREATE TABLE tbl ( a int, b int, c int, PRIMARY KEY(`a`,`b`,`c`));
未指定主键或主键非int或bigint
- Content:未指定主键或主键非int或bigint,建议将主键设置为int unsigned或bigint unsigned。
- Case:
CREATE TABLE tbl (a int);
ORDER BY多个列但排序方向不同时可能无法使用索引
- Content:在MySQL 8.0之前当ORDER BY多个列指定的排序方向不同时将无法使用已经建立的索引。
- Case:
SELECT * FROM tbl ORDER BY a DESC, b ASC;
添加唯一索引前请注意检查数据唯一性
- Content:请提前检查添加唯一索引列的数据唯一性,如果数据不唯一在线表结构调整时将有可能自动将重复列删除,这有可能导致数据丢失。
- Case:
CREATE UNIQUE INDEX part_of_name ON customer (name(10));