在这种情况下,MyISAM比mysql中的InnoDB快得多

有博尔达

我一直在写一个算法的结果,该算法计算InnoDB表中客户之间的距离。例如,如果我的客户是A,B,C和D,则数据库中的表如下所示,其中包括其他列:

From | To    | Distance
  A     B        344
  A     C        274
  A     D        182
  B     C        338

依此类推...我想我会达到5000万行。

其他列是product_type和value。那些告诉我,客户B(列中的customer_to)购买了该product_type的数量。这意味着我每对都有多次,这取决于客户B购买了多少种product_type。

我需要查询以将每个客户与邻居购买的产品和价值分组。查询如下所示:

select customer_from, product_type, avg(value) as opportunity
from customer_distances
where distance < 500
group by customer_from, product_type
order by opportunity desc; 

innodb表无法回答该查询。尽管我将net_read_timeout更改为28800,但在查询过程中mysql连接丢失。

我坚信这与用于事务处理而不是用于密集查询的innodb构建有关。因此,我创建了一个以MyIsam作为引擎的新表,并从innodb表中插入所有记录。

不出所料,选择非常快(70段),而其他所有选择(如count(distingant customer_from)都几乎是瞬时的)。

出于好奇,我尝试继续在myisam表中插入距离的过程。当程序开始运行的速度比在innodb表上运行的速度至少快100倍时(对于INSERTS),这让我感到惊讶!

对于每个客户,程序会插入约3000行(每个product_type的每个邻居插入一行。每个客户约300的邻居和10个product_type)。通过插入innodb表,单个客户花费了40到60秒(约3000行)的时间。使用myisam表,插入3个客户(大约9000行aprox)需要1秒。

一些额外的信息:

  • mysql数据库位于我的PC(本地主机)中。
  • 该程序用Java编写,并从我的PC运行。
  • 我正在使用准备好的语句,并且只更改每行与下一行之间的数据。这与这个问题有关为什么myisam存储引擎比Innodb存储引擎快

因此,总的来说,问题是:为什么MyISAM的插入语句这么快?你怎么认为?

编辑1:我正在为两个表,innodb和myisam添加create语句。编辑2:我删除了一些无用的信息,并在这里和那里格式化了一些。

/* INNODB TABLE */
CREATE TABLE `customer_distances` (
  `customer_from` varchar(50) NOT NULL,
  `customer_from_type` varchar(50) DEFAULT NULL,
  `customer_from_segment` varchar(50) DEFAULT NULL,
  `customer_from_district` int(11) DEFAULT NULL,
  `customer_from_zone` int(11) DEFAULT NULL,
  `customer_from_longitud` decimal(15,6) DEFAULT NULL,
  `customer_from_latitud` decimal(15,6) DEFAULT NULL,
  `customer_to` varchar(50) NOT NULL,
  `customer_to_type` varchar(50) DEFAULT NULL,
  `customer_to_segment` varchar(50) DEFAULT NULL,
  `customer_to_district` int(11) DEFAULT NULL,
  `customer_to_zone` int(11) DEFAULT NULL,
  `customer_to_longitud` decimal(15,6) DEFAULT NULL,
  `customer_to_latitud` decimal(15,6) DEFAULT NULL,
  `distance` decimal(10,2) DEFAULT NULL,
  `product_business_line` varchar(50) DEFAULT NULL,
  `product_type` varchar(50) NOT NULL,
  `customer_from_liters` decimal(10,2) DEFAULT NULL,
  `customer_from_dollars` decimal(10,2) DEFAULT NULL,
  `customer_from_units` decimal(10,2) DEFAULT NULL,
  `customer_to_liters` decimal(10,2) DEFAULT NULL,
  `customer_to_dollars` decimal(10,2) DEFAULT NULL,
  `customer_to_units` decimal(10,2) DEFAULT NULL,
  `liters_opportunity` decimal(10,2) DEFAULT NULL,
  `dollars_opportunity` decimal(10,2) DEFAULT NULL,
  `units_oportunity` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`cliente_desde`,`cliente_hasta`,`grupo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/* MYISAM TABLE */
CREATE TABLE `customer_distances` (
  `customer_from` varchar(50) NOT NULL,
  `customer_from_type` varchar(50) DEFAULT NULL,
  `customer_from_segment` varchar(50) DEFAULT NULL,
  `customer_from_district` int(11) DEFAULT NULL,
  `customer_from_zone` int(11) DEFAULT NULL,
  `customer_from_longitud` decimal(15,6) DEFAULT NULL,
  `customer_from_latitud` decimal(15,6) DEFAULT NULL,
  `customer_to` varchar(50) NOT NULL,
  `customer_to_type` varchar(50) DEFAULT NULL,
  `customer_to_segment` varchar(50) DEFAULT NULL,
  `customer_to_district` int(11) DEFAULT NULL,
  `customer_to_zone` int(11) DEFAULT NULL,
  `customer_to_longitud` decimal(15,6) DEFAULT NULL,
  `customer_to_latitud` decimal(15,6) DEFAULT NULL,
  `distance` decimal(10,2) DEFAULT NULL,
  `product_business_line` varchar(50) DEFAULT NULL,
  `product_type` varchar(50) NOT NULL,
  `customer_from_liters` decimal(10,2) DEFAULT NULL,
  `customer_from_dollars` decimal(10,2) DEFAULT NULL,
  `customer_from_units` decimal(10,2) DEFAULT NULL,
  `customer_to_liters` decimal(10,2) DEFAULT NULL,
  `customer_to_dollars` decimal(10,2) DEFAULT NULL,
  `customer_to_units` decimal(10,2) DEFAULT NULL,
  `liters_opportunity` decimal(10,2) DEFAULT NULL,
  `dollars_opportunity` decimal(10,2) DEFAULT NULL,
  `units_oportunity` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`cliente_desde`,`cliente_hasta`,`grupo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
里克·詹姆斯

插入物

  • 默认情况下,InnoDBINSERT立即“提交” 可以通过一次集中100-1000行来解决此问题。
  • 批量插入将加快MyISAM和InnoDB的速度-可能提高10倍。
  • 了解autocommitBEGIN..COMMIT

选择

  • InnoDB比MyISAM消耗更多的磁盘空间-通常为2x-3x;这会影响表扫描,您可能
  • 对于该查询,(customer_from,product_type,distance)上的复合索引可能会帮助两个引擎。

调音

  • 运行MyISAM时,将key_buffer_sizeRAM和设置为20%innodb_buffer_pool_size=0
  • 运行InnoDB时,key_buffer_size设置为10M并设置innodb_buffer_pool_size为70%的RAM。

规范化和节省空间

  • 较小->更具可缓存性->更少的I / O->更快(在任一引擎中)
  • DECIMAL(10,2)在大多数情况下不是最好的。考虑FLOAT使用非货币(例如distance)。考虑较少的数字;最多可处理99,999,999.99,并占用5个字节。
  • 它通常是不具有复制列,如的10列一个好主意customer_fromcustomer_to有一张Customers桌子,里面都有。
  • 您的经纬度均为7个字节,并且没有必要的分辨率。建议latidud DECIMAL(6,4)longitud (7,4)总共7个字节。(这些分辨率为16m / 52ft。)

结果

根据这些建议,50M行表将非常小,并且在两个引擎中的运行速度都非常快。然后再次运行比较。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在这种情况下,MyISAM比mysql中的InnoDB快得多

来自分类Dev

在这种情况下,为什么sed没有比opk快得多的操作

来自分类Dev

在这种情况下,是否需要InnoDB?

来自分类Dev

在这种情况下如何使用 mySQL ORDER BY

来自分类Dev

在这种情况下python比C慢得多的原因是什么?

来自分类Dev

在这种简单情况下,为什么Matlab看起来比Python慢得多

来自分类Dev

在这种情况下,如何计算mysql中的行总数?

来自分类Dev

在这种情况下,如何在MYSQL / SQL中查询数据?

来自分类Dev

在这种情况下,延迟在rxjs中如何工作?

来自分类Dev

在这种情况下阅读JSON?

来自分类Dev

在这种情况下的GIT实施

来自分类Dev

在这种情况下解释输出

来自分类Dev

在这种情况下,应如何使用外键从不同的mysql表中删除数据?

来自分类Dev

为什么<比!=快得多?

来自分类Dev

为什么Python中的这段代码比C ++快得多?

来自分类Dev

在这种情况下,如何获取MySQL的最后一行?

来自分类Dev

mysql:在这种情况下索引多列的最佳方法是什么

来自分类Dev

在这种情况下,如何使MYSQL选择查询一对多?

来自分类Dev

“错误:在这种情况下”在Qt 5中安装QFtp

来自分类Dev

在这种情况下,处理AngularJS中事件的最佳方法是什么?

来自分类Dev

在这种情况下,我可以从反应库中受益吗?

来自分类Dev

在这种情况下,为什么不能在lambda中引用变量?

来自分类Dev

在这种情况下,如何替换php中的字符串值?

来自分类Dev

为什么在这种情况下,本地承诺似乎比chrome中的回调要快?

来自分类Dev

在这种情况下,我应该如何处理Clojure中的可变状态?

来自分类Dev

Coffeescript,在这种情况下如何在函数中传递变量?

来自分类Dev

在这种情况下,如何在foreach php中删除当前用户?

来自分类Dev

在这种情况下,“方法”对于类型查找不明确,Alamofire中的错误

来自分类Dev

在这种特定情况下,RTOS中的互斥体

Related 相关文章

  1. 1

    在这种情况下,MyISAM比mysql中的InnoDB快得多

  2. 2

    在这种情况下,为什么sed没有比opk快得多的操作

  3. 3

    在这种情况下,是否需要InnoDB?

  4. 4

    在这种情况下如何使用 mySQL ORDER BY

  5. 5

    在这种情况下python比C慢得多的原因是什么?

  6. 6

    在这种简单情况下,为什么Matlab看起来比Python慢得多

  7. 7

    在这种情况下,如何计算mysql中的行总数?

  8. 8

    在这种情况下,如何在MYSQL / SQL中查询数据?

  9. 9

    在这种情况下,延迟在rxjs中如何工作?

  10. 10

    在这种情况下阅读JSON?

  11. 11

    在这种情况下的GIT实施

  12. 12

    在这种情况下解释输出

  13. 13

    在这种情况下,应如何使用外键从不同的mysql表中删除数据?

  14. 14

    为什么<比!=快得多?

  15. 15

    为什么Python中的这段代码比C ++快得多?

  16. 16

    在这种情况下,如何获取MySQL的最后一行?

  17. 17

    mysql:在这种情况下索引多列的最佳方法是什么

  18. 18

    在这种情况下,如何使MYSQL选择查询一对多?

  19. 19

    “错误:在这种情况下”在Qt 5中安装QFtp

  20. 20

    在这种情况下,处理AngularJS中事件的最佳方法是什么?

  21. 21

    在这种情况下,我可以从反应库中受益吗?

  22. 22

    在这种情况下,为什么不能在lambda中引用变量?

  23. 23

    在这种情况下,如何替换php中的字符串值?

  24. 24

    为什么在这种情况下,本地承诺似乎比chrome中的回调要快?

  25. 25

    在这种情况下,我应该如何处理Clojure中的可变状态?

  26. 26

    Coffeescript,在这种情况下如何在函数中传递变量?

  27. 27

    在这种情况下,如何在foreach php中删除当前用户?

  28. 28

    在这种情况下,“方法”对于类型查找不明确,Alamofire中的错误

  29. 29

    在这种特定情况下,RTOS中的互斥体

热门标签

归档