Php MySQL:密钥/值存储查询优化
我正在寻求帮助,以建立正确的索引我已经尝试了太多,现在我有点迷失,正确的MySQL引擎MyIsam,InnoDB。。。并帮助我查询连接。。。。当我想到这些查询应该返回count*时,我也感到头疼 我每次查询的时间都超过5-10秒,但我不确定是否可以为这个大数据库获得更好的时间 我正在尝试优化此MySQL表: 项目~600k行: 项目\u关系~1M行: 项目\u值~4M行: 我基本上运行以下常见查询: 一,。查询-值状态>1的所有项目: 二,。查询-具有与其他项目相关的某些值的所有项目:Php MySQL:密钥/值存储查询优化,php,mysql,optimization,store,key-value,Php,Mysql,Optimization,Store,Key Value,我正在寻求帮助,以建立正确的索引我已经尝试了太多,现在我有点迷失,正确的MySQL引擎MyIsam,InnoDB。。。并帮助我查询连接。。。。当我想到这些查询应该返回count*时,我也感到头疼 我每次查询的时间都超过5-10秒,但我不确定是否可以为这个大数据库获得更好的时间 我正在尝试优化此MySQL表: 项目~600k行: 项目\u关系~1M行: 项目\u值~4M行: 我基本上运行以下常见查询: 一,。查询-值状态>1的所有项目: 二,。查询-具有与其他项目相关的某些值的所有项目: 提前谢谢
提前谢谢 如果您询问索引,那么您几乎已经拥有了所需的所有索引 我刚才有个问题 |名称| varchar255 |是| MUL | NULL || 所以我更愿意将其设置为主键 关于桌子的结构,我只有一个建议 如果您的文件中混合了字符串和数字 |值|长文本|是| |空|| 创建另一列int_值,有符号或无符号更好 并且,只要需要将该列用作筛选器和/或搜索条件,就应该将该列设置为索引 并在适用的情况下填写“插入/更新”字段 此修改将提高查询的性能,您不应该像这里这样对数百万条记录使用强制转换和/或转换:
AND CONVERT(`value_status`.`value`, SIGNED) >= 1
AND (CONVERT(category_rgt.value, UNSIGNED) BETWEEN 2805 AND 4222)
所以我对结构没有更多的评论
但我想请你试试我的查询,就像一个实验,如果它比你的快。不幸的是,我无法调试任何数据。如果你提供一些sqlfiddle,这将非常有帮助
SELECT `company`.`id` AS `id`,
`company`.`type` AS `type`
FROM `items` AS `company`
INNER JOIN (
SELECT
item_id,
FROM items_values
WHERE name = 'status'
AND CONVERT(value, SIGNED) >= 1
) AS value_status
ON value_status.item_id = company.id
INNER JOIN
(
SELECT
lft_item_id
FROM
items_relationships
INNER JOIN (
SELECT
item_id
FROM
items_values
WHERE name = 'rgt'
AND (CONVERT(value, UNSIGNED) BETWEEN 2805 AND 4222)
) AS category_rgt
ON category_rgt.item_id = items_relationships.rgt_item_id
WHERE items_relationships.rel_type = 'company_category'
) as companies_categories
ON (`companies_categories`.`lft_item_id` = `company`.`id`)
WHERE `company`.`type` = 'company'
GROUP BY `company`.`id`
ORDER BY `company`.`id` DESC
LIMIT 10
众所周知,键值存储的编码非常笨拙,而且无法扩展。这里有一个关于如何做的博客。看起来很有用,但我得多读几遍才能弄清楚。。如果我们有这个示例解决方案,将有助于我更好地理解..我稍微改进了items\u value的设计,创建了额外的列value\u index type int,以防止转换,并在name和value\u index上创建了新的组合索引。我会试试结果
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| item_id | int(11) unsigned | NO | PRI | 0 | |
| name | varchar(255) | YES | MUL | NULL | |
| value | longtext | YES | | NULL | |
| lang | varchar(2) | YES | | NULL | |
+---------+------------------+------+-----+---------+----------------+
SELECT `company`.`id` AS `id`,
`company`.`type` AS `type`
FROM `items` AS `company`
INNER JOIN `items_values` AS `value_name` ON (`company`.`id` = `value_name`.`item_id`)
WHERE `company`.`type` = 'company'
AND `value_name`.`name` = 'status'
AND CONVERT(`value_name`.`value`, SIGNED) > 1
GROUP BY `company`.`id`
ORDER BY `company`.`id` DESC
LIMIT 0, 30
SELECT `company`.`id` AS `id`,
`company`.`type` AS `type`
FROM `items` AS `company`
INNER JOIN `items_values` AS `value_status` ON (`value_status`.`item_id` = `company`.`id`)
INNER JOIN `items_relationships` AS `companies_categories` ON (`companies_categories`.`lft_item_id` = `company`.`id`)
INNER JOIN `items_values` AS `category_rgt` ON (`category_rgt`.`item_id` = `companies_categories`.`rgt_item_id`)
WHERE `company`.`type` = 'company'
AND `company`.`type` = 'company'
AND `value_status`.`name` = 'status'
AND CONVERT(`value_status`.`value`, SIGNED) >= 1
AND `category_rgt`.`name` = 'rgt'
AND (CONVERT(category_rgt.value, UNSIGNED) BETWEEN 2805 AND 4222)
AND `companies_categories`.`rel_type` = 'company_category'
GROUP BY `company`.`id`
ORDER BY `company`.`id` DESC LIMIT 10
OFFSET 0
AND CONVERT(`value_status`.`value`, SIGNED) >= 1
AND (CONVERT(category_rgt.value, UNSIGNED) BETWEEN 2805 AND 4222)
SELECT `company`.`id` AS `id`,
`company`.`type` AS `type`
FROM `items` AS `company`
INNER JOIN (
SELECT
item_id,
FROM items_values
WHERE name = 'status'
AND CONVERT(value, SIGNED) >= 1
) AS value_status
ON value_status.item_id = company.id
INNER JOIN
(
SELECT
lft_item_id
FROM
items_relationships
INNER JOIN (
SELECT
item_id
FROM
items_values
WHERE name = 'rgt'
AND (CONVERT(value, UNSIGNED) BETWEEN 2805 AND 4222)
) AS category_rgt
ON category_rgt.item_id = items_relationships.rgt_item_id
WHERE items_relationships.rel_type = 'company_category'
) as companies_categories
ON (`companies_categories`.`lft_item_id` = `company`.`id`)
WHERE `company`.`type` = 'company'
GROUP BY `company`.`id`
ORDER BY `company`.`id` DESC
LIMIT 10