我有几乎标准的MariaDB和InnoDB引擎工作良好,但我想测试蜘蛛引擎+切分/分区。我有一个查询,它在MariaDB InnoDB上传递罚款15-20分钟。有了蜘蛛引擎,不管我做了什么,它总是从记忆中消失。与蜘蛛引擎的设置是,我有一个蜘蛛引擎与两个后端与适当的分区在这两个。
在哪里我错了。我应该在配置中更改什么。
MariaDB [(none)]> show variables like '%spider%';
+---------------------------------------+-----------+
| Variable_name | Value |
+---------------------------------------+-----------+
| spider_auto_increment_mode | -1 |
| spider_bgs_first_read | -1 |
| spider_bgs_mode | 3 |
| spider_bgs_second_read | -1 |
| spider_bka_engine | |
| spider_bka_mode | 1 |
| spider_bka_table_name_type | -1 |
| spider_block_size | 16384 |
| spider_bulk_size | -1 |
| spider_bulk_update_mode | -1 |
| spider_bulk_update_size | 128000000 |
| spider_casual_read | -1 |
| spider_conn_recycle_mode | 1 |
| spider_conn_recycle_strict | 0 |
| spider_connect_mutex | OFF |
| spider_connect_retry_count | 1000 |
| spider_connect_retry_interval | 1000 |
| spider_connect_timeout | 28000 |
| spider_crd_bg_mode | -1 |
| spider_crd_interval | -1 |
| spider_crd_mode | -1 |
| spider_crd_sync | -1 |
| spider_crd_type | -1 |
| spider_crd_weight | -1 |
| spider_delete_all_rows_type | -1 |
| spider_direct_dup_insert | -1 |
| spider_direct_order_limit | 1 |
| spider_dry_access | OFF |
| spider_error_read_mode | -1 |
| spider_error_write_mode | -1 |
| spider_first_read | -1 |
| spider_force_commit | 1 |
| spider_general_log | OFF |
| spider_init_sql_alloc_size | -1 |
| spider_internal_limit | -1 |
| spider_internal_offset | -1 |
| spider_internal_optimize | -1 |
| spider_internal_optimize_local | -1 |
| spider_internal_sql_log_off | OFF |
| spider_internal_unlock | OFF |
| spider_internal_xa | OFF |
| spider_internal_xa_id_type | 0 |
| spider_internal_xa_snapshot | 0 |
| spider_local_lock_table | OFF |
| spider_lock_exchange | OFF |
| spider_log_result_error_with_sql | 0 |
| spider_log_result_errors | 0 |
| spider_low_mem_read | 1 |
| spider_max_order | 32767 |
| spider_multi_split_read | 1 |
| spider_net_read_timeout | 28000 |
| spider_net_write_timeout | -1 |
| spider_ping_interval_at_trx_start | 3600 |
| spider_quick_mode | 3 |
| spider_quick_page_size | 8096 |
| spider_read_only_mode | -1 |
| spider_remote_access_charset | |
| spider_remote_autocommit | 1 |
| spider_remote_default_database | |
| spider_remote_sql_log_off | 0 |
| spider_remote_time_zone | |
| spider_remote_trx_isolation | -1 |
| spider_reset_sql_alloc | -1 |
| spider_same_server_link | OFF |
| spider_second_read | -1 |
| spider_select_column_mode | -1 |
| spider_selupd_lock_mode | -1 |
| spider_semi_split_read | 8 |
| spider_semi_split_read_limit | 8 |
| spider_semi_table_lock | 1 |
| spider_semi_table_lock_connection | -1 |
| spider_semi_trx | ON |
| spider_semi_trx_isolation | -1 |
| spider_skip_default_condition | -1 |
| spider_split_read | -1 |
| spider_sts_bg_mode | -1 |
| spider_sts_interval | -1 |
| spider_sts_mode | -1 |
| spider_sts_sync | -1 |
| spider_support_xa | ON |
| spider_sync_autocommit | ON |
| spider_sync_time_zone | OFF |
| spider_sync_trx_isolation | ON |
| spider_table_init_error_interval | 1 |
| spider_udf_ct_bulk_insert_interval | -1 |
| spider_udf_ct_bulk_insert_rows | -1 |
| spider_udf_ds_bulk_insert_rows | -1 |
| spider_udf_ds_table_loop_mode | -1 |
| spider_udf_ds_use_real_table | -1 |
| spider_udf_table_lock_mutex_count | 20 |
| spider_udf_table_mon_mutex_count | 20 |
| spider_use_all_conns_snapshot | OFF |
| spider_use_consistent_snapshot | OFF |
| spider_use_default_database | ON |
| spider_use_flash_logs | OFF |
| spider_use_handler | -1 |
| spider_use_pushdown_udf | -1 |
| spider_use_snapshot_with_flush_tables | 0 |
| spider_use_table_charset | -1 |
| spider_version | 3.2.21 |
+---------------------------------------+-----------+发布于 2015-07-21 22:10:51
我不认为这个问题完全是问题所在。它不是作为一个整体的蜘蛛存储引擎(SSE)。您应该关注SSE的一个特定方面:到每个碎片的DB连接。
考虑一下DB连接如何分配内存。
下面是与单个DB连接相关联的缓冲区:
鉴于SSE必须保持到两个碎片的开放连接,请想象正在发生的情况:
当这两个连接都保存它的数据份额时,正在进行聚合。
以下是我过去关于DB连接的内存消耗的文章
Apr 24, 2012:打开和关闭DB连接的成本有多高?Apr 25, 2012:内存不足mysql被中止Oct 01, 2014:缓存中的线程仍然使用内存吗?至于查询,您将生成一个完整的结果,然后从1,000万行中提取。很可能,在查询完成之前,来自两个DB连接的内存不会被释放。
为什么对数据的InnoDB版本的查询可以工作呢?最有可能的是,生成的任何临时表最终都会被写入磁盘以继续处理整个结果集,所有这些都是在一个DB连接中完成的。
您可能需要降低一些缓冲区大小,才能使DB连接转到磁盘或使RAM的数量翻两番。请花点时间对它们进行调整。
还有一件事:根据视图进行聚合肯定会创建大型临时表。尝试重构查询以检索更少的行,即使在InnoDB的情况下也是如此。
https://dba.stackexchange.com/questions/107683
复制相似问题