Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:密钥/值存储查询优化_Php_Mysql_Optimization_Store_Key Value - Fatal编程技术网

Php MySQL:密钥/值存储查询优化

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的所有项目: 二,。查询-具有与其他项目相关的某些值的所有项目: 提前谢谢

我正在寻求帮助,以建立正确的索引我已经尝试了太多,现在我有点迷失,正确的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