我们的数据库结构以这种方式将元表用于大多数核心对象:

db_object:id(主键),field1,field2,...
db_object_meta:id(主键),object_id,meta_key,meta_value

我们已经运行了几个月,没有任何重大问题,但是最近,我们经历了一些严重的延迟,由于它们的大小已经增长到(500,000行+),因此我们的元表很可能是罪魁祸首。

我们通常以直接方式查询元表,例如:

SELECT `id` FROM `db_object_meta WHERE `object_id` = 9999

SELECT `meta_key`, `meta_value` FROM `db_object_meta WHERE `object_id` = 9999

SELECT `meta_value` FROM `db_object_meta WHERE `object_id` = 9999 AND `meta_key` = 'key1'


这些类型的查询似乎被阻塞并造成了瓶颈。如何提高效率?

将INDEX添加到object_id列是否可以提高性能,这是否会使所有现有查询保持不变并且不需要调整?

我标记了Wordpress,因为我知道它充分利用了post meta表。

创建表(从注释添加)

CREATE TABLE wm_object_meta (
    id int(32) NOT NULL,
    store_id int(32) NOT NULL,
    object_id int(32) NOT NULL,
    meta_key varchar(64) NOT NULL,
    meta_value longtext NOT NULL,
    PRIMARY KEY (id),
    KEY object_id (object_id,meta_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

最佳答案

在object_id上建立索引可能会有所帮助,这取决于表中有多少个不同的object_id值。通常,将索引添加到where子句中使用的任何字段都可以提高性能。

编辑:不,添加索引将不需要您更改任何现有查询或语句。

关于php - 元表效率低下,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38668327/

10-13 00:11