当前位置: 首页 > 知识库问答 >
问题:

MySQL程序占用了太多的时间,并且表非常大

晏德佑
2023-03-14

我有一个大型的实时数据库,其中大约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

共有1个答案

夹谷星河
2023-03-14

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

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

从一个巨大的表中选择*。其中包含文本/图像/文件的列将会非常慢。在你不需要的时候尽量限制选择这样的胖栏。

未来读数:

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)所以我没有在这里写它。当我运行这个应用程序时,它占用了我大约