1

我需要加快查询速度。我要找的是索引表吗?如果是这样,我该怎么做?我必须在每次插入时更新它吗?

以下是表模式:

--table1--   |   --tableA--   |    --table2--
id           |   id           |    id
attrib1      |   t1id         |    attrib1
attrib2      |   t2id         |    attrib2
             |   attrib1      |

和查询:

SELECT 
  table1.attrib1, 
  table1.attrib2,
  tableA.attrib1 
FROM 
  table1,
  tableA
WHERE 
  table1.id = tableA.t1id
  AND (tableA.t2id = x or ... or tableA.t2id = z)
GROUP BY 
  table1.id
4

1 回答 1

7

您需要在以下位置创建复合索引tableA

CREATE INDEX ix_tablea_t1id_t2id ON table_A (t1id, t2id)

中的索引MySQL被认为是表的一部分:它们会自动更新,并在优化器决定使用它们时自动使用。

MySQL不使用术语index table

该术语用于Oracle指其他数据库所称CLUSTERED INDEX的:一种表,其中记录本身根据列(或一组列)的值排列。

MySQL

  • 使用MyISAM存储时,索引将创建为具有.MYI扩展名的单独文件。

    该文件的内容表示一个B-Tree,每个叶子包含索引键和指向.MYD包含数据的文件中的偏移量的指针。

    指针的大小由名为 的服务器设置决定myisam_data_pointer_size,它可以从27字节变化,默认为6since MySQL 5.0.6

    这允许创建MyISAM最多2 ^ (8 * 6) bytes=256 TB

  • InnoDB中,所有的表都是按 固有顺序排列的PRIMARY KEY,它不支持堆组织的表。

    因此,每个索引实际上只是一个InnoDB由单个记录组成的普通表PRIMARY KEYN+M记录N是索引值,M记录是PRIMARY KEY保存索引数据的主表记录的一个。

于 2009-05-08T19:31:51.710 回答