我们的数据库结构以这种方式将元表用于大多数核心对象:
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/