MySQL是否在创建新索引时使用现有索引?

Pen*_*m10 2 mysql sql indexing query-optimization

我有一张包含数百万条记录的大桌子.

Table `price`
------------
id 
product 
site 
value
Run Code Online (Sandbox Code Playgroud)

该表是全新的,并且没有创建索引.

然后,我使用以下查询发出了创建新索引的请求:

CREATE INDEX ix_price_site_product_value_id ON price (site, product, value, id);
Run Code Online (Sandbox Code Playgroud)

这花了很长时间,上次我检查跑了5000多秒,因为机器.

我想知道如果我发出另一个索引创建,它会在进程计算中使用现有索引吗?如果是这样的形式?

在运行查询1旁边:

CREATE INDEX ix_price_product_value_id ON price (product, value, id);
Run Code Online (Sandbox Code Playgroud)

在运行查询2旁边:

CREATE INDEX ix_price_value_id ON price (value, id);
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 5

我想知道如果我发出另一个索引创建,它会在进程计算中使用现有索引吗?如果是这样的形式?

不,它不会.

从理论上讲,索引on (site, product, value, id)具有在这些字段的任何子集上构建索引所需的一切(包括on (product, value, id)和的索引(value, id)).

但是,不支持从二级索引构建索引.

首先,MySQL不支持快速全索引扫描(即以物理顺序扫描索引而不是逻辑),从而使索引访问路径比表读取更昂贵.这不是问题InnoDB,因为表本身总是聚集的.

其次,这些索引中的记录顺序完全不同,因此无论如何都需要对记录进行排序.

但是,索引创建速度的主要问题MySQL是它在站点上生成订单(只是将记录逐个插入到a中B-Tree)而不是使用预先排序的源.正如@Daniel所提到的,快速索引创建解决了这个问题.它可以作为插件使用5.1并预装5.5.