AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 142745
Accepted
DavidK
DavidK
Asked: 2016-07-02 00:40:43 +0800 CST2016-07-02 00:40:43 +0800 CST 2016-07-02 00:40:43 +0800 CST

mysql NDB集群上的所有查询都很慢

  • 772

这是我的情况:

我得到了超过 10G 的网络日志(大约 3000 万行),我主要用各种条件搜索它。

例如:

select * from tbl 
where ip = '123.123.12.3' 
  and agent = 'mozillar' 
  and body like '%script%'

随着数据越来越大,一个简单的查询需要几分钟,所以我试图用 MySQL 集群创建一些分布式数据库。

我在 Google 云虚拟机上构建了 1 个管理服务器、1 个 SQL (api) 服务器和 4 个数据节点。每个实例有 2 个 CPU 和 8 GB。

问题:

当我尝试从 .sql 文件恢复数据时,每个插入语句几乎需要 2~3 秒!

3 秒 * 30m 行 = 永远!

选择查询也让我很失望,它比普通 InnoDB 花费了将近 100 倍的时间。

难道我做错了什么?

有没有更好的解决方案适合我的目的?

配置文件

[ndbd default]
NoOfReplicas=2    
DataMemory=5G    
IndexMemory=128M   
MaxNoOfConcurrentOperations=1000000
MaxNoOfLocalOperations=1100000
MaxNoOfConcurrentTransactions=327680
NoOfFragmentLogFiles=256
FragmentLogFileSize=32M
SharedGlobalMemory=512M
DiskPageBufferMemory=512M
DiskIoThreadPool=8

[ndb_mgmd]
NodeId=1
hostname=10.142.0.7
datadir=/var/lib/mysql-cluster/mgmt


[ndbd]
NodeId=11
hostname=10.142.0.8
datadir=/var/lib/mysql-cluster/data1
[ndbd]
NodeId=12
hostname=10.142.0.9
datadir=/var/lib/mysql-cluster/data2
[ndbd]
NodeId=13
hostname=10.142.0.10
datadir=/var/lib/mysql-cluster/data3
[ndbd]
NodeId=14
hostname=10.142.0.11
datadir=/var/lib/mysql-cluster/data4

[mysqld]
NodeId=100

所有节点都按预期连接到管理服务器

-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     4 node(s)
id=11   @10.142.0.8  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0, *)
id=12   @10.142.0.9  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0)
id=13   @10.142.0.10  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 1)
id=14   @10.142.0.11  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.142.0.7  (mysql-5.6.29 ndb-7.4.11)
[mysqld(API)]   1 node(s)
id=100  @10.142.0.2  (mysql-5.6.29 ndb-7.4.11)

附加信息:

    Create Table: CREATE TABLE `tbl` (
  `no` int(11) NOT NULL AUTO_INCREMENT,
  `rule_name` varchar(50) DEFAULT NULL,
  `ip` varchar(20) DEFAULT NULL,
  `detection_time` datetime NOT NULL,
  `uri` text,
  `site` varchar(500) DEFAULT NULL,
  `country` varchar(50) DEFAULT NULL,
  `body` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `detection_string` text,
  `detection_type` int(11) NOT NULL,
  `action` int(11) NOT NULL,
  `category` int(10) NOT NULL,
  PRIMARY KEY (`no`),
  KEY `no` (`no`),
  KEY `ip` (`ip`)
) ENGINE=InnoDB AUTO_INCREMENT=21682043 DEFAULT CHARSET=utf8
1 row in set (0.03 sec)
mysql ndbcluster
  • 1 1 个回答
  • 1526 Views

1 个回答

  • Voted
  1. Best Answer
    Rick James
    2016-07-11T07:34:27+08:002016-07-11T07:34:27+08:00

    冗余索引。APRIMARY KEY是一个索引,所以不需要多余的KEY no(no)。(DROPping这会加快速度。)

    代理人。agent架构中的哪里?它是一个varchar吗?还是枚举?或归一化SMALLINT UNSIGNED。最后一个会节省空间,从而提高速度,但会使插入复杂化。

    更好的索引。替换INDEX(ip)为INDEX(ip, agent)。这将加快给定的SELECT一些。(但我怀疑代理对于给定的 IP 通常是相同的。)

    国家代码有非常标准的 2 字母国家代码;使用它们而不是笨重的varchar(50).

    批处理。现在为了真正的加速......批量插入。将它们收集在表、交换表INSERT..SELECT等中。 详细信息在此处。这种技术是自我调整的;因此,如果事情变得更慢,他们的行动也会变得更有效率。该链接还解释了如何有效地规范化。

    调音。 IndexMemory=128M看起来小得不合理。

    回到 InnoDB?

    选择查询也让我很失望,它比普通 InnoDB 花费了将近 100 倍的时间。

    我提到的技术非常适合 InnoDB;我对 NDB Cluster 的经验较少。也许你应该回到 InnoDB,我们可以努力让它变得更好? innodb_buffer_pool_size应该是 RAM 的 70% 左右。

    IPv6。附注:IPv4 只需要VARCHAR(15); IPv6 需要(39)。ip 地址也可以是CHARACTER SET asciiutf8,而不是 utf8。(这里没有显着的性能优势。)

    • 1

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve