我们的数据库结构以这种方式利用大多数核心对象的元表:
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'
这些类型的查询似乎被堵塞并导致瓶颈。可以做什么来提高效率?
向 object_id 列添加 INDEX 是否会提高性能,并且这是否会使所有现有查询保持不变且不需要调整?
我标记了 WordPress,因为我知道它充分利用了帖子元表。
创建表(从评论中添加)
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/