0

我正在使用下面的选择查询从表中搜索。

"Select * from authentication_codes where client_id=6"

列 client_id 是整数类型,我也索引了该列。表中有总36751694记录,authentication_codes其中20200000属于 client_id 6。

每当我同时达到 4 次以上 SQL 查询时,mysql 就会因错误"mysql server gone away"而崩溃,CPU 利用率会达到 95%。

相同查询的解释命令输出如下

mysql> explain Select * from authentication_codes where client_id=6 \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: authentication_codes
         type: ref
possible_keys: index_authentication_codes_on_client_id
          key: index_authentication_codes_on_client_id
      key_len: 5
          ref: const
         rows: 18475849
        Extra: Using where
1 row in set (0.00 sec)

同时命中 3 个 SQL 请求语句后,使用 top 命令的 CPU 利用率如下

top - 09:13:43 up  2:28,  4 users,  load average: 1.94, 0.67, 0.52
Tasks: 123 total,   2 running, 121 sleeping,   0 stopped,   0 zombie
%Cpu(s): 91.0 us,  2.8 sy,  0.0 ni,  5.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.4 st
KiB Mem:   4046840 total,  2439948 used,  1606892 free,     6836 buffers
KiB Swap:        0 total,        0 used,        0 free.  1929160 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4543 mysql     20   0  886304 176544   7068 S 188.0  4.4   2:53.83 mysqld

我的服务器有 4GB 的内存和 2 个 CPU 核心。Mysql 表使用数据库引擎 Innodb。

谢谢,

4

1 回答 1

0

服务器没有“崩溃” ;客户端放弃了,因为服务器花了很长时间。

摆脱 ; 上的client_id索引 扫描整个表以发现它们中的大多数都有'6'会更快。

客户到底要如何处理 2000 万(2000 万)行?可能会耗尽客户端中的内存。如果您需要查看所有这些,请以 1000 个为单位读取该表。如果您需要COUNT()SUM()其他什么,请在 SQL 中执行。

你有一台小机器(只有 4GB)?如果表是 InnoDB,你应该innodb_buffer_pool_size设置为 1500M。

至于max_allowed_packet,请考虑您的连接是否在返回任何内容之前等待所有行,然后一次返回所有 20M。也许今天 1G 会起作用;也许明天不会。您能否设置连接以“在获取行时”提供行。总体而言,这将花费更长的时间,但不会达到数据包限制。

于 2015-12-24T23:27:30.830 回答