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)
我想知道如果我发出另一个索引创建,它会在进程计算中使用现有索引吗?如果是这样的形式?
不,它不会.
从理论上讲,索引on (site, product, value, id)具有在这些字段的任何子集上构建索引所需的一切(包括on (product, value, id)和的索引(value, id)).
但是,不支持从二级索引构建索引.
首先,MySQL不支持快速全索引扫描(即以物理顺序扫描索引而不是逻辑),从而使索引访问路径比表读取更昂贵.这不是问题InnoDB,因为表本身总是聚集的.
其次,这些索引中的记录顺序完全不同,因此无论如何都需要对记录进行排序.
但是,索引创建速度的主要问题MySQL是它在站点上生成订单(只是将记录逐个插入到a中B-Tree)而不是使用预先排序的源.正如@Daniel所提到的,快速索引创建解决了这个问题.它可以作为插件使用5.1并预装5.5.