SQL优化规则_13_Key相关

建议使用自增列作为主键,如使用联合自增主键时请将自增键作为第一列

  • 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)

表建的索引过多

  • Content:表建的索引过多
  • Case:
CREATE TABLE tbl ( a int, b int, c int, KEY idx_a (`a`),KEY idx_b(`b`),KEY idx_c(`c`));

主键中的列过多

  • Content:主键中的列过多
  • Case:
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));

你可能感兴趣的:(SQL优化规则_13_Key相关)