【问题标题】:MySQL prcedures take too much time and the tables are very largeMySQL 过程花费太多时间并且表非常大
【发布时间】:2014-04-10 06:55:59
【问题描述】:

我有一个大型实时数据库,其中大约 1000 个用户每分钟更新 2 个或更多更新。同时有 4 个用户正在获取报告并添加新项目。到目前为止,主要的 2 个表包含大约 200 万和 400 万行。

使用这些表的查询花费了太多时间,即使是简单的查询,例如:

"SELECT COUNT(*) FROM MyItemsTable"  and  "SELECT COUNT(*) FROM MyTransactionsTable"

需要 10 秒和 26 秒

大型报告现在需要 15 分钟!!!时间太长了。

我使用的所有表都是innodb

在我阅读声誉之前有什么办法可以解决这个问题??

提前感谢您的任何帮助

编辑 这是MyItemsTable的结构和索引:

CREATE TABLE `pos_MyItemsTable` (
  `itemid` bigint(15) NOT NULL,
  `uploadid` bigint(15) NOT NULL,
  `itemtypeid` bigint(15) NOT NULL,
  `statusid` int(1) NOT NULL,
  `uniqueid` varchar(10) DEFAULT NULL,
  `referencenb` varchar(30) DEFAULT NULL,
  `serialnb` varchar(25) DEFAULT NULL,
  `code` varchar(50) DEFAULT NULL,
  `user` varchar(16) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `pass` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `expirydate` date DEFAULT NULL,
  `userid` bigint(15) DEFAULT NULL,
  `insertdate` datetime DEFAULT NULL,
  `updateuser` bigint(15) DEFAULT NULL,
  `updatedate` datetime DEFAULT NULL,
  `counternb` int(1) DEFAULT '0',
  PRIMARY KEY (`itemid`),
  UNIQUE KEY `referencenb_unique` (`referencenb`),
  KEY `MyItemsTable_r04` (`itemtypeid`),
  KEY `MyItemsTable_r05` (`uploadid`),
  KEY `FK_MyItemsTable` (`statusid`),
  KEY `ind_MyItemsTable_serialnb` (`serialnb`),
  KEY `uniqueid_key` (`uniqueid`),
  KEY `ind_MyItemsTable_insertdate` (`insertdate`),
  KEY `ind_MyItemsTable_counternb` (`counternb`),
  CONSTRAINT `FK_MyItemsTable` FOREIGN KEY (`statusid`) REFERENCES `MyItemsTable_statuses` (`statusid`),
  CONSTRAINT `MyItemsTable_r04` FOREIGN KEY (`itemtypeid`) REFERENCES `itemstypes` (`itemtypeid`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `MyItemsTable_r05` FOREIGN KEY (`uploadid`) REFERENCES `uploads` (`uploadid`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8

【问题讨论】:

  • 你索引你的表了吗?
  • 尝试用(id)替换(*)
  • 呜呜!!第一个耗时 0.5 秒,第二个耗时 1.6 秒
  • @user3518239 如果您将SELECT 换成SELECT SQL_NO_CACHE,您可以在避免缓存的同时测试性能。
  • 好的,非常感谢!!

标签: mysql


【解决方案1】:

只有很少的索引并不意味着您的表和查询得到了优化。

尝试找出运行最慢的查询并在那里添加特定的索引。

从一个巨大的表中选择* .. 你有包含文本/图像/文件的列 会走得很慢。当您不需要这些 fat 列时,请尽量限制它们的选择。

未来的阅读:

http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

还有一些更高级的配置:

http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/

http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

source

更新
尝试对一些最繁重的查询使用复合键, 通过将比较的主要字段放在 ONE 索引中:

`MyItemsTable_r88` (`itemtypeid`,`statusid`, `serialnb`), ...

这将为仅比较索引中的列的查询提供更快的结果:

SELECT * FROM my_table WHERE `itemtypeid` = 5 AND `statusid` = 0  AND `serialnb` > 500

如果您从索引中搜索和选择值,速度会非常快:

SELECT `serialnb` FROM my_table WHERE `statusid` = 0  `itemtypeid` IN(1,2,3);

这是非常基本的示例,您需要多阅读并分析数据以获得最佳结果。

【讨论】:

  • 感谢您指点我,在我认为任何答案都是正确答案之前,我必须阅读很多内容。谢谢你,当我找到解决方案时会通知你:)
  • 现在我认为你的回答是正确的。如果我有新的评论,我稍后会问你。谢谢
  • 感谢您的更新,我将在 Where 子句中使用“AND”的许多列上添加更多索引。谢谢:)
猜你喜欢
  • 2018-01-08
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 2022-06-22
  • 2016-05-07
相关资源
最近更新 更多