我有一个大型的实时数据库,其中大约1000个用户每分钟更新2个或更多的更新。同时,有4个用户正在获取报告和添加新的项目。到目前为止,主表包含大约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
只有很少的索引并不意味着您的表和查询得到了优化。
尝试识别运行最慢的查询,并在那里添加特定的索引。
从一个巨大的表中选择*
。其中包含文本/图像/文件的列将会非常慢。在你不需要的时候尽量限制选择这样的胖栏。
未来读数:
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/Choice-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);
这是非常基本的例子,您将不得不阅读多一点,并分析数据,以获得最好的结果。
我正在我的SQL中使用一个查询。首先我用 我该怎么做才能让它快过2秒
此select语句返回4k行。在我的应用程序中占用时间的是while循环。单循环就需要2到4分钟。关于如何优化它有什么想法吗? 不要太担心查询本身,因为它不会在查询响应上花费太多时间。
MySQLdump和上传过程花费了太长的时间(~8小时)来完成整个过程。 我正在将活动数据库转储到mysqldump.tar文件和几乎3GB。当我加载到新的数据库,它需要6-8小时来完成这个过程(上传到新的数据库)。 我要完成这个过程,推荐的解决方案是什么?
嗨,我对java编程还比较陌生。我编写的下面的程序似乎占用了很多内存(大约240 MB,正常吗?-我不这么认为!)请建议一些方法来优化这个程序,以便减少内存存储。 程序-- 代码-
我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存
我有一个包含单个面板的JFrame。在面板中,我使用paintComponent方法根据JFrame的大小调整其元素的大小。JPanel的元素是一个作为背景的图像和4个JLabel,它包含4个ImageIcon,工作方式类似于按钮。Jpanel的方法paintComponent如下所示 这个框架只有一个简单的方法,add(myPanel)所以我没有在这里写它。当我运行这个应用程序时,它占用了我大约