我们的数据库结构以这种方式利用了对大多数核心对象的元表的使用:
db_object:id(PRIMARY KEY),field1,field2,... db_object_meta:id(PRIMARY KEY),object_id,meta_key,meta_value
我们已经运行了几个月而没有任何重大问题,但是最近我们遇到了一些严重的延迟,我们的meta表可能是由于它们已经增长到(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 (从评论中添加)
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
答案 0 :(得分:1)
object_id上的索引可能有所帮助,它取决于表中有多少个不同的object_id值。通常,向where子句中使用的任何字段添加索引都有可能提高性能。
编辑:不,添加索引不需要您更改任何现有的查询或语句。
答案 1 :(得分:1)
请发布SHOW CREATE TABLE post_meta
;我的回答是基于您提供的模糊信息。
这三个查询需要db_object_meta上的这个索引:
PRIMARY KEY(object_id, meta_key)
并且id
没用,应该删除。但这太难以问了,因为它涉及太多地方的太多变化。
真正的问题是WP使用"实体 - 属性 - 值"架构设计,很容易缩放。