MySQL:表中字段的顺序对性能有影响吗?

700*_*are 7 performance

具体来说,我想知道是否应该将所有固定长度字段(如 int、timestamp、char)放在 CREATE TABLE 的开头,并将所有可变长度varchar放在末尾。

另外,我想知道TEXT字段是否有不同的处理方式。

ran*_*omx 2

根据 RDBMS 存储引擎,它可能会在内部重新排序字段以进行存储和显示。如果我们从C程序的角度来看这个问题,数据库中的表就像一个C结构体。例如,ac 程序中的表可能如下所示:

typedef struct _Table {
  char type,      /* 1 byte   */
  int id,         /* 4 bytes  */
  char *name;     /* 4 bytes  */
  char city[25];  /* 25 bytes */ 
} Table;          /* 34 bytes total */
Run Code Online (Sandbox Code Playgroud)

您可以看到,在您的程序中,您将期望第一个结构元素位于第一个指针位置,然后一个字节将是您的第二个元素位置,等等......这些称为偏移量。

您的 RDBMS 可能会将文件数据结构存储在 ac 样式结构中,以便它可以了解每行数据的偏移量(内存位置)。然后将应用索引来在相似的行组中进行搜索。索引位置只是指向每个匹配行(或结构)的第一个字节的指针。

作为软件工程师类型,您可能希望打包结构,以便最小的数据类型位于结构的开头,以便当您的指针算术扫描它们时,您会更快地找到结论,但这是一个设计决策。

最重要的是,最佳实践是按照从最小到最大的顺序设计模型,但无论如何它可能会根据存储引擎的要求进行重新组织。