我有一个大型的实时数据库,大约有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
答案 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/
<强>更新强>:
尝试使用复合键进行一些最重的查询,
通过放置在一个索引中比较的主要字段:
`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);
这是非常基本的示例,您需要阅读更多内容并分析数据以获得最佳结果。