MySQL程序占用太多时间并且表格非常大

时间:2014-04-10 06:55:59

标签: mysql

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

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

"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

1 个答案:

答案 0 :(得分:1)

只需拥有少量索引并不意味着您的表和查询已经过优化。

尝试识别运行速度最慢的querties并在那里添加特定的索引。

从一个巨大的表中选择* ..其中包含包含文本/图像/文件的列 将会很慢。当您不需要时,尽量限制选择 fat <​​/ strong>列。

未来的读物:

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

<强>更新
尝试使用复合键进行一些最重的查询, 通过放置在一个索引中比较的主要字段:

`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);

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