MySQL长首次查询时间

MySQL长首次查询时间,mysql,database,performance,innodb,Mysql,Database,Performance,Innodb,我有一个网站,它有两个对数据库的主要查询,第一次运行时速度非常慢,经过一点测试,这似乎是MySQL的问题。如果我在第一次运行查询时直接在Sequal Pro中运行查询,可能需要4秒才能运行,但再次运行同一查询需要约60毫秒,查询时间在本地与服务器上大致相同,这让我认为这不是服务器问题 不完全确定增加缓冲池大小是否会有太大帮助,因为潜在查询组合的数量可能在800K左右 数据库中的表是innodb,两个查询都访问同一个表,该表有52K条记录,我需要的大多数信息已组合到一个“searchfield”字

我有一个网站,它有两个对数据库的主要查询,第一次运行时速度非常慢,经过一点测试,这似乎是MySQL的问题。如果我在第一次运行查询时直接在Sequal Pro中运行查询,可能需要4秒才能运行,但再次运行同一查询需要约60毫秒,查询时间在本地与服务器上大致相同,这让我认为这不是服务器问题

不完全确定增加缓冲池大小是否会有太大帮助,因为潜在查询组合的数量可能在800K左右

数据库中的表是innodb,两个查询都访问同一个表,该表有52K条记录,我需要的大多数信息已组合到一个“searchfield”字段中,该字段已编制索引

仅对查询中使用的字段或主键/外键进行索引

我已经尝试在主查询的where中将内部联接更改为select语句,但这并没有使查询更快

问题是

问题1

问题2

表结构

-

-

-

-

-

任何关于如何改进初始查询时间的建议都将非常有用

提前感谢:

-编辑-

解释选择查询1

解释选择查询2

启动服务器后第一次执行查询时,没有缓存,因此查询需要从磁盘获取内容。由于缓存的存在,访问相同表的相同部分的所有后续查询都会更快。这是正常的

如果启用了查询缓存,那么在默认情况下可能会启用它,那么第二次运行完全相同的查询时,它将立即从查询缓存中找到结果。确切地说,我的意思是,甚至连一个空格都没有改变。几乎所有生产服务器最好关闭查询缓存

innodb_缓冲区_池_大小应为可用RAM的70%左右。更改该值不会影响对冷缓存的选择,但可能有助于/损害后续运行。这似乎与您的情况无关,因为第二次运行相当快

请提供解释选择。。。因此,我们可以看到优化器决定如何执行它们

例如“%c:35”∆%' - 由于前导通配符,无法使用索引

什么是项目标识

item_属性是一个EAV模式。真糟糕。这两个查询都很难看,可伸缩性也很差。它可以帮助一些人摆脱id,并从其他字段的适当组合中生成复合主键。希望是使用与数据聚集在一起的主键,而不必从主键跳出

假设基数较低,则可能永远不会使用索引:
钥匙是\u选项是\u选项

谢谢您提供的信息。我将尝试将通配符更改为另一个联接,看看这是否有帮助。谢谢你提供关于EAV的信息,我会看看我是否能让它与Yii一起工作:与我们服务器的技术支持人员交谈,他建议将池大小更改为40%,尽管我在这里的另一篇帖子上看到它可以变为70%,但这似乎只能容纳查询1中的3个。我们有1GB的RAM,所以池大小目前约为400MB。1GB。即使是400MB也高得危险。交换对MySQL性能非常不利,比现在有一个缓冲池更糟糕。检查my.cnf的其余部分-其他一些东西可能需要降低。嗯,但是你说‘innodb_buffer_pool_大小应该是可用RAM的70%左右’它只设置为40%,现在你说这太高了。我有点搞不清楚现在应该设置什么,它最初只占可用RAM的48MB70%,而不是总RAM的70%。当你的内存不足4GB时,很多内存都被操作系统、mysql和其他东西占用了。我认为70%是一种简单、安全的状态。那是在机器变得4GB和更大之后。对于128GB,70%可以提高到80-85,但好处在于收益递减。然后是虚拟和云,它们的内存分配很小。这把我的70%搞砸了,我必须强调可用性,并关注2G和1G机器。如果使用1G中的700M,则可能需要交换—这比降低缓冲池要糟糕得多。
SELECT 
  `item_attribute`.`attribute_id` AS `attribute_id`,
  `attribute_value_id` AS `attribute_value_id`,
  `collection_attribute`.`title` AS `ca_title`,
  `collection_attribute`.`type` AS `ca_type`,
  `collection_attribute`.`is_collapsible` AS `ca_is_collapsible`,
  `collection_attribute`.`orderindex` AS `ca_orderindex`,
  `collection_attribute`.`multi_select` AS `ca_multi_select`,
  `item_attribute`.`item_id` AS `item_id`,
  `product`.`id` AS `product_id` 
  FROM `item_attribute`
  INNER JOIN `item` ON item.id = item_attribute.item_id
  INNER JOIN `product` ON product.id = item.product_id
  INNER JOIN `collection_attribute` ON item_attribute.attribute_id = collection_attribute.attribute_id
  INNER JOIN `attribute_value` ON attribute_value.id = item_attribute.attribute_value_id 
  WHERE ((`product`.`searchfilter` LIKE '%c:35∆%') AND (`collection_attribute`.`collection_id`='35')) AND (`attribute_value`.`active`=1)
  GROUP BY `attribute_value_id`
SELECT DISTINCT `item_attribute`.`attribute_id` AS `attribute_id`,
  GROUP_CONCAT(item_attribute.attribute_value_id SEPARATOR \"-\") AS `attribute_value`,
  GROUP_CONCAT(attribute_value.title SEPARATOR \" - \") AS `title`
  FROM `item_attribute`
  LEFT JOIN `item` ON item.id = item_attribute.item_id 
  LEFT JOIN `attribute` ON attribute.id = item_attribute.attribute_id 
  LEFT JOIN `attribute_value` ON attribute_value.id = attribute_value_id 
  WHERE (`item`.`product_id`='894') AND (`attribute`.`is_option`=1) 
  GROUP BY `attribute_id`, `item_id`
CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `sku` varchar(20) NOT NULL,
  `active` tinyint(1) DEFAULT '0',
  `orderindex` int(2) DEFAULT '-1',
  `search` varchar(255) DEFAULT NULL,
  `searchfilter` varchar(255) DEFAULT NULL,
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  `protected` tinyint(1) DEFAULT '0',
  `description` varchar(512) DEFAULT NULL,
  `type_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `product_ibfk_1` (`type_id`),
  KEY `searchfilter` (`searchfilter`),
  CONSTRAINT `product_ibfk_1` FOREIGN KEY (`type_id`) REFERENCES `attribute_value` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1882 DEFAULT CHARSET=utf8;
CREATE TABLE `collection_attribute` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `collection_id` int(11) DEFAULT NULL,
  `attribute_id` int(11) DEFAULT NULL,
  `title` varchar(512) NOT NULL,
  `slug` varchar(512) NOT NULL,
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  `active` tinyint(1) DEFAULT '0',
  `orderindex` int(2) DEFAULT '-1',
  `search` varchar(255) DEFAULT NULL,
  `searchfilter` varchar(255) DEFAULT NULL,
  `protected` tinyint(1) DEFAULT '0',
  `is_collapsible` tinyint(1) DEFAULT '0',
  `type` enum('icon','checkbox','checkboxIcon','image') DEFAULT NULL,
  `multi_select` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `collection_attribute_ibfk_1` (`collection_id`),
  KEY `collection_attribute_ibfk_2` (`attribute_id`),
  CONSTRAINT `collection_attribute_ibfk_1` FOREIGN KEY (`collection_id`) REFERENCES `collection` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `collection_attribute_ibfk_2` FOREIGN KEY (`attribute_id`) REFERENCES `attribute` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=140 DEFAULT CHARSET=utf8;
    CREATE TABLE `item` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `slug` varchar(255) NOT NULL,
  `title` varchar(255) NOT NULL,
  `pattern_code` varchar(32) NOT NULL,
  `tom_code` varchar(32) NOT NULL,
  `navision_code` varchar(32) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `active` tinyint(1) DEFAULT '0',
  `orderindex` int(2) DEFAULT '-1',
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  `search` varchar(1024) DEFAULT NULL,
  `searchfilter` varchar(255) DEFAULT NULL,
  `product_id` int(11) DEFAULT NULL,
  `protected` tinyint(1) DEFAULT '0',
  `pattern_series` varchar(255) DEFAULT NULL,
  `pattern_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `item_ibfk_1` (`product_id`),
  KEY `searchfilter` (`searchfilter`),
  KEY `product_id` (`product_id`),
  KEY `pattern_id` (`pattern_id`),
  CONSTRAINT `item_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `item_ibfk_2` FOREIGN KEY (`pattern_id`) REFERENCES `pattern_series` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=50060 DEFAULT CHARSET=utf8;
CREATE TABLE `item_attribute` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_id` int(11) NOT NULL,
  `attribute_id` int(11) NOT NULL,
  `attribute_value_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `attribute_id` (`attribute_id`),
  KEY `attribute_value_id` (`attribute_value_id`),
  KEY `item_id` (`item_id`),
  CONSTRAINT `item_attribute_ibfk_1` FOREIGN KEY (`attribute_id`) REFERENCES `attribute` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `item_attribute_ibfk_2` FOREIGN KEY (`attribute_value_id`) REFERENCES `attribute_value` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `item_attribute_ibfk_3` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=857111 DEFAULT CHARSET=utf8;
CREATE TABLE `attribute_value` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `slug` varchar(255) NOT NULL,
  `code` varchar(255) DEFAULT NULL,
  `title` varchar(255) NOT NULL,
  `active` tinyint(1) DEFAULT '0',
  `orderindex` int(2) DEFAULT '-1',
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  `search` varchar(255) DEFAULT NULL,
  `searchfilter` varchar(255) DEFAULT NULL,
  `attribute_id` int(11) DEFAULT NULL,
  `protected` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3471 DEFAULT CHARSET=utf8;
CREATE TABLE `attribute` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `code` varchar(255) DEFAULT NULL,
  `is_option` tinyint(1) DEFAULT '0',
  `searches` tinyint(1) DEFAULT '0',
  `option_type` enum('dropdown','switch','fingersizes') DEFAULT NULL,
  `option_label` varchar(32) DEFAULT NULL,
  `active` tinyint(1) DEFAULT '0',
  `orderindex` int(2) DEFAULT '-1',
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  `search` varchar(255) DEFAULT NULL,
  `searchfilter` varchar(255) DEFAULT NULL,
  `protected` tinyint(1) DEFAULT '0',
  `option_requires` int(11) DEFAULT NULL,
  `option_depends` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `is_option` (`is_option`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8;