不正狼 发表于 2018-10-26 11:39:28

mongodb与mysql全表扫描能力PK

  nosql的数据在内存里,而传统rdbms,某个select第一次执行的时候,如果发现内存里没有需要的数据(比如mysql的innodb buffer pool),会去从磁盘读取,然后再开始计算,这样子从原理上就必然比nosql要慢一些,但是,会慢多少呢?可以用一个分组统计的全表扫描来PK下。
  测试环境如下:
  server:阿里云服务器(Ubuntu14.04+1核cpu和 1G内存)
  mysql:5.5.41
  mysql服务端参数:innodb_buffer_pool_size = 512M   (其余都默认)
  mongodb:2.4.9
  这里用一个1000多万行记录的表作为测试对象,这个表只有一个字段:imsi。
  在mysql里建测试对象,导表:
  create database db_test;
  create table ul_inbound(imsi varchar(15));
  load data infile '/tmp/inbound.sub.log' into table ul_inbound(imsi);
  测试结果:
  mysql> select imsi,count(*) from ul_inbound group by imsi having count(*) >5000;
  +-----------------+----------+
  | imsi            | count(*) |
  +-----------------+----------+
  | 250017831851018 |   5166 |
  | 283100106389033 |    21291 |
  | 302720304966683 |    41598 |
  | 302720502859575 |   8787 |
  | 302720505260881 |   7932 |
  | 310170801568405 |   6018 |
  | 310170802085117 |    13452 |
  | 310170802299726 |    13824 |
  | 310410577936479 |   5772 |
  | 310410610359421 |   5790 |
  | 310410661857060 |   7038 |
  | 310410669731926 |   7788 |
  | 310410671702203 |   6705 |
  | 310410673812082 |   5403 |
  +-----------------+----------+
  53 rows in set (1 min 47.73 sec)
  花了107秒。
  在mongodb里导入数据(导入到my_mongodb的sub里):
  #!/usr/bin/python
  # Python:2.7.6
  # Filename:mongodb.py
  import pymongo
  import random
  conn = pymongo.Connection("127.0.0.1",27017)#Connection() without parameters will default connect localhost mongodb
  db = conn.my_mongodb
  for imsi in open('inbound.sub.log'):
  imsi = imsi.strip('\n')
  db.sub.insert({'imsi':imsi})
  > use my_mongodb;
  switched to db my_mongodb
  > db.sub.aggregate( [ { $group: { _id: "$imsi",count: { $sum: 1 } } }, { $match: { count: { $gt: 5000 } } } ]);
  {
  "result" : [
  {
  "_id" : "401025006559964",
  "count" : 17982
  },
  {
  "_id" : "310410757405261",
  "count" : 7269
  },
  10秒左右搞定。
  注:
  1)这个只是为了测试全表扫描能力,实际mysql查询能力会受到索引、服务端参数等诸多因素的影响。
  2)mongodb的使用,必须内存管够,如果内存不够,要用swap,能力会大受影响。

页: [1]
查看完整版本: mongodb与mysql全表扫描能力PK