1

I feel like I may of made a mistake with my database design.

At the moment I have 73182 tables, 4 days ago I had 72236, and just 2 months ago we only had about 20k tables - so our growth spiked.

Essentially, each customer has their own set of tables for the CRM, these tables are almost all very similar, except that it just holds data unique to them. With a bit of refactoring, I could very easily copy data across to only a few tables with a huge amount of rows (Which means I could probably drop near 71000 tables). However I would like thoughts and opinions on this, a lot of data and actions happen in the CRM so I figured the look ups would be much quicker since there would be less need for using multiple keys.

I am using MySQL on Google "Cloud". My server at the moment is 8vCPU@52GB memory, next tier is 16vCPU@104GB memory. I am tossing up whether I set file InnoDB file per table = NO or not, at the moment it is = YES. I am purely using InnoDB.

innodb_read_io_threads
innodb_write_io_threads

Are both set to 4 (default), I can not change them - the google support representative notified me that if I could give a clear enough reason why I need to change this; they will allow it. Ideally I want it to go to 16 or so. I have not seen any pending reads/writes in the InnoDB status yet, I will check occasionally.

Here are all of my stats dumped (sorry for the long post)

Here are my variables currently

allow_client_hostname_forwarding=ON
allow_repl_client_for_replication_config=OFF
auto_generate_certs=ON
auto_increment_increment=1
auto_increment_offset=1
autocommit=ON
automatic_sp_privileges=ON
avoid_temporal_upgrade=OFF
back_log=850
basedir=/mysql/
big_tables=OFF
bind_address=*
binlog_cache_size=32768
binlog_checksum=CRC32
binlog_direct_non_transactional_updates=OFF
binlog_error_action=ABORT_SERVER
binlog_format=ROW
binlog_group_commit_sync_delay=0
binlog_group_commit_sync_no_delay_count=0
binlog_gtid_simple_recovery=ON
binlog_max_flush_queue_time=0
binlog_order_commits=ON
binlog_row_image=FULL
binlog_rows_query_log_events=OFF
binlog_stmt_cache_size=32768
block_encryption_mode=aes-128-ecb
block_slave_sql_access=0
block_user_access=33280
bulk_insert_buffer_size=8388608
character_set_client=utf8
character_set_connection=utf8
character_set_database=utf8
character_set_filesystem=binary
character_set_results=utf8
character_set_server=utf8
character_set_system=utf8
character_sets_dir=/usr/share/mysql/charsets/
check_proxy_users=OFF
collation_connection=utf8_general_ci
collation_database=utf8_general_ci
collation_server=utf8_general_ci
completion_type=NO_CHAIN
concurrent_insert=AUTO
connect_timeout=10
core_file=OFF
datadir=/mysql/datadir/
date_format=%Y-%m-%d
datetime_format=%Y-%m-%d %H:%i:%s
default_authentication_plugin=mysql_native_password
default_password_lifetime=0
default_storage_engine=InnoDB
default_tmp_storage_engine=InnoDB
default_week_format=0
delay_key_write=ON
delayed_insert_limit=100
delayed_insert_timeout=300
delayed_queue_size=1000
disabled_storage_engines=
disconnect_on_expired_password=ON
div_precision_increment=4
end_markers_in_json=OFF
enforce_gtid_consistency=ON
enforce_storage_engine=
eq_range_index_dive_limit=200
error_count=0
event_scheduler=OFF
expire_logs_days=0
explicit_defaults_for_timestamp=OFF
external_user=
flush=OFF
flush_time=0
force_ssl_for_tcp=NONE
foreign_key_checks=ON
ft_boolean_syntax=+ -><()~*:\"\"&|
ft_max_word_len=84
ft_min_word_len=4
ft_query_expansion_limit=20
ft_stopword_file=(built-in)
general_log=OFF
general_log_file=/mysql/logs/general.log
group_concat_max_len=1024
gtid_executed_compression_period=1000
gtid_mode=ON
gtid_next=AUTOMATIC
gtid_owned=
gtid_purged=5fd39415-ca37-11e6-9729-42010a800034:1-387725664
have_compress=YES
have_crypt=YES
have_dynamic_loading=YES
have_geometry=YES
have_openssl=YES
have_profiling=YES
have_query_cache=YES
have_rtree_keys=YES
have_ssl=YES
have_statement_timeout=YES
have_symlink=YES
host_cache_size=803
hostname=localhost
identity=0
ignore_builtin_innodb=OFF
ignore_db_dirs=
init_connect=
init_file=
init_slave=
innodb_adaptive_flushing=ON
innodb_adaptive_flushing_lwm=10
innodb_adaptive_hash_index=ON
innodb_adaptive_hash_index_parts=8
innodb_adaptive_max_sleep_delay=150000
innodb_api_bk_commit_interval=5
innodb_api_disable_rowlock=OFF
innodb_api_enable_binlog=OFF
innodb_api_enable_mdl=OFF
innodb_api_trx_level=0
innodb_autoextend_increment=64
innodb_autoinc_lock_mode=1
innodb_buffer_pool_chunk_size=134217728
innodb_buffer_pool_dump_at_shutdown=ON
innodb_buffer_pool_dump_now=OFF
innodb_buffer_pool_dump_pct=25
innodb_buffer_pool_filename=ib_buffer_pool
innodb_buffer_pool_instances=8
innodb_buffer_pool_load_abort=OFF
innodb_buffer_pool_load_at_startup=ON
innodb_buffer_pool_load_now=OFF
innodb_buffer_pool_size=40802189312
innodb_change_buffer_max_size=25
innodb_change_buffering=all
innodb_checksum_algorithm=crc32
innodb_checksums=ON
innodb_cmp_per_index_enabled=OFF
innodb_commit_concurrency=0
innodb_compression_failure_threshold_pct=5
innodb_compression_level=6
innodb_compression_pad_pct_max=50
innodb_concurrency_tickets=5000
innodb_data_file_path=ibdata1:12M:autoextend
innodb_data_home_dir=
innodb_default_row_format=dynamic
innodb_disable_sort_file_cache=OFF
innodb_doublewrite=ON
innodb_fast_shutdown=1
innodb_file_format=Barracuda
innodb_file_format_check=ON
innodb_file_format_max=Barracuda
innodb_file_per_table=ON
innodb_fill_factor=100
innodb_flush_log_at_timeout=1
innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT
innodb_flush_neighbors=2
innodb_flush_sync=ON
innodb_flushing_avg_loops=5
innodb_force_load_corrupted=OFF
innodb_force_recovery=0
innodb_ft_aux_table=
innodb_ft_cache_size=8000000
innodb_ft_enable_diag_print=OFF
innodb_ft_enable_stopword=ON
innodb_ft_max_token_size=84
innodb_ft_min_token_size=3
innodb_ft_num_word_optimize=2000
innodb_ft_result_cache_limit=2000000000
innodb_ft_server_stopword_table=
innodb_ft_sort_pll_degree=2
innodb_ft_total_cache_size=640000000
innodb_ft_user_stopword_table=
innodb_io_capacity=5000
innodb_io_capacity_max=10000
innodb_large_prefix=ON
innodb_lock_wait_timeout=50
innodb_locks_unsafe_for_binlog=OFF
innodb_log_buffer_size=16777216
innodb_log_checksums=ON
innodb_log_compressed_pages=ON
innodb_log_file_size=536870912
innodb_log_files_in_group=2
innodb_log_group_home_dir=./
innodb_log_write_ahead_size=8192
innodb_lru_scan_depth=2048
innodb_max_dirty_pages_pct=75.000000
innodb_max_dirty_pages_pct_lwm=0.000000
innodb_max_purge_lag=0
innodb_max_purge_lag_delay=0
innodb_max_undo_log_size=1073741824
innodb_monitor_disable=
innodb_monitor_enable=all
innodb_monitor_reset=
innodb_monitor_reset_all=
innodb_old_blocks_pct=37
innodb_old_blocks_time=1000
innodb_online_alter_log_max_size=134217728
innodb_open_files=2000
innodb_optimize_fulltext_only=OFF
innodb_page_cleaners=8
innodb_page_size=16384
innodb_print_all_deadlocks=OFF
innodb_purge_batch_size=300
innodb_purge_rseg_truncate_frequency=128
innodb_purge_threads=4
innodb_random_read_ahead=OFF
innodb_read_ahead_threshold=56
innodb_read_io_threads=4
innodb_read_only=OFF
innodb_replication_delay=0
innodb_rollback_on_timeout=OFF
innodb_rollback_segments=128
innodb_sort_buffer_size=1048576
innodb_spin_wait_delay=6
innodb_stats_auto_recalc=ON
innodb_stats_method=nulls_equal
innodb_stats_on_metadata=OFF
innodb_stats_persistent=ON
innodb_stats_persistent_sample_pages=20
innodb_stats_sample_pages=8
innodb_stats_transient_sample_pages=8
innodb_status_output=OFF
innodb_status_output_locks=OFF
innodb_strict_mode=ON
innodb_support_xa=ON
innodb_sync_array_size=1
innodb_sync_spin_loops=30
innodb_table_locks=ON
innodb_temp_data_file_path=ibtmp1:12M:autoextend
innodb_thread_concurrency=0
innodb_thread_sleep_delay=10000
innodb_tmpdir=
innodb_undo_directory=./
innodb_undo_log_truncate=OFF
innodb_undo_logs=128
innodb_undo_tablespaces=0
innodb_use_native_aio=ON
innodb_version=5.7.14
innodb_write_io_threads=4
insert_id=0
interactive_timeout=28800
internal_tmp_disk_storage_engine=InnoDB
join_buffer_size=262144
keep_files_on_create=OFF
key_buffer_size=8388608
key_cache_age_threshold=300
key_cache_block_size=1024
key_cache_division_limit=100
large_files_support=ON
large_page_size=0
large_pages=OFF
last_insert_id=0
lc_messages=en_US
lc_messages_dir=/usr/share/mysql/
lc_time_names=en_US
license=GPL
local_infile=ON
lock_wait_timeout=31536000
locked_in_memory=OFF
log_bin=ON
log_bin_basename=/mysql/binlog/mysql-bin
log_bin_index=/mysql/binlog/mysql-bin.index
log_bin_trust_function_creators=OFF
log_bin_use_v1_row_events=OFF
log_builtin_as_identified_by_password=OFF
log_error=stderr
log_error_verbosity=3
log_n_first_received_events=4
log_n_first_sent_events=4
log_output=TABLE
log_queries_not_using_indexes=OFF
log_slave_updates=ON
log_slow_admin_statements=OFF
log_slow_slave_statements=OFF
log_statements_unsafe_for_binlog=ON
log_syslog=OFF
log_syslog_facility=daemon
log_syslog_include_pid=ON
log_syslog_tag=
log_throttle_queries_not_using_indexes=0
log_timestamps=UTC
log_warnings=2
long_query_time=2.000000
low_priority_updates=OFF
lower_case_file_system=OFF
lower_case_table_names=0
master_info_repository=TABLE
master_verify_checksum=OFF
max_allowed_packet=268435456
max_binlog_cache_size=18446744073709547520
max_binlog_size=104857600
max_binlog_stmt_cache_size=18446744073709547520
max_connect_errors=100
max_connections=4000
max_delayed_threads=20
max_digest_length=1024
max_error_count=64
max_execution_time=0
max_heap_table_size=16777216
max_insert_delayed_threads=20
max_join_size=18446744073709551615
max_length_for_sort_data=1024
max_points_in_geometry=65536
max_prepared_stmt_count=16382
max_relay_log_size=0
max_seeks_for_key=18446744073709551615
max_sort_length=1024
max_sp_recursion_depth=0
max_tmp_tables=32
max_user_connections=0
max_write_lock_count=18446744073709551615
metadata_locks_cache_size=1024
metadata_locks_hash_instances=8
min_examined_row_limit=0
multi_range_count=256
mysql_native_password_proxy_users=OFF
net_buffer_length=16384
net_read_timeout=30
net_retry_count=10
net_write_timeout=60
new=OFF
ngram_token_size=2
offline_mode=OFF
old=OFF
old_alter_table=OFF
old_passwords=0
open_files_limit=1048576
optimizer_prune_level=1
optimizer_search_depth=62
optimizer_trace=enabled=off,one_line=off
optimizer_trace_limit=1
optimizer_trace_max_mem_size=16384
optimizer_trace_offset=-1
parser_max_mem_size=18446744073709551615
performance_schema=OFF
performance_schema_accounts_size=0
performance_schema_digests_size=0
performance_schema_events_stages_history_long_size=0
performance_schema_events_stages_history_size=0
performance_schema_events_statements_history_long_size=0
performance_schema_events_statements_history_size=0
performance_schema_events_transactions_history_long_size=0
performance_schema_events_transactions_history_size=0
performance_schema_events_waits_history_long_size=0
performance_schema_events_waits_history_size=0
performance_schema_hosts_size=0
performance_schema_max_cond_classes=0
performance_schema_max_cond_instances=0
performance_schema_max_digest_length=0
performance_schema_max_file_classes=0
performance_schema_max_file_handles=0
performance_schema_max_file_instances=0
performance_schema_max_index_stat=0
performance_schema_max_memory_classes=0
performance_schema_max_metadata_locks=0
performance_schema_max_mutex_classes=0
performance_schema_max_mutex_instances=0
performance_schema_max_prepared_statements_instances=0
performance_schema_max_program_instances=0
performance_schema_max_rwlock_classes=0
performance_schema_max_rwlock_instances=0
performance_schema_max_socket_classes=0
performance_schema_max_socket_instances=0
performance_schema_max_sql_text_length=0
performance_schema_max_stage_classes=0
performance_schema_max_statement_classes=0
performance_schema_max_statement_stack=0
performance_schema_max_table_handles=0
performance_schema_max_table_instances=0
performance_schema_max_table_lock_stat=0
performance_schema_max_thread_classes=0
performance_schema_max_thread_instances=0
performance_schema_session_connect_attrs_size=0
performance_schema_setup_actors_size=0
performance_schema_setup_objects_size=0
performance_schema_users_size=0
pid_file=/mysql/mysql.pid
plugin_dir=/usr/lib/mysql/plugin/
port=3306
preload_buffer_size=32768
profiling=OFF
profiling_history_size=15
protocol_version=10
proxy_user=
pseudo_slave_mode=OFF
pseudo_thread_id=162
query_alloc_block_size=8192
query_cache_limit=1048576
query_cache_min_res_unit=4096
query_cache_size=1048576
query_cache_type=OFF
query_cache_wlock_invalidate=OFF
query_prealloc_size=8192
rand_seed1=0
rand_seed2=0
range_alloc_block_size=4096
range_optimizer_max_mem_size=8388608
rbr_exec_mode=STRICT
read_buffer_size=131072
read_only=OFF
read_rnd_buffer_size=262144
relay_log=/mysql/relaylog/relay-log
relay_log_basename=/mysql/relaylog/relay-log
relay_log_index=/mysql/relaylog/relay-log.index
relay_log_info_file=relay-log.info
relay_log_info_repository=TABLE
relay_log_purge=ON
relay_log_recovery=ON
relay_log_space_limit=0
report_host=
report_password=
report_port=3306
report_user=
require_secure_transport=OFF
require_super_for_system_schema_ddl=information_schema,mysql,performance_schema,sys
require_super_for_system_table_writes=event,func,plugin,proc,heartbeat
reserved_super_connections=20
rpl_semi_sync_master_async_notify_sleep_interval=1000000
rpl_semi_sync_master_async_notify_socket=/semisync/semisync.sock
rpl_semi_sync_master_async_notify_timeout=5000000
rpl_semi_sync_master_do_async_notify=ON
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_slave_lag_heartbeat_frequency_us=500000
rpl_semi_sync_master_timeout=3000
rpl_semi_sync_master_trace_level=32
rpl_semi_sync_master_wait_for_slave_count=1
rpl_semi_sync_master_wait_no_slave=ON
rpl_semi_sync_master_wait_point=AFTER_SYNC
rpl_semi_sync_slave_enabled=OFF
rpl_semi_sync_slave_lag_enabled=OFF
rpl_semi_sync_slave_trace_level=32
rpl_stop_slave_timeout=31536000
secure_auth=ON
secure_file_priv=/mysql/tmp/
server_id=1655813737
server_id_bits=32
server_uuid=5fd39415-ca37-11e6-9729-42010a800034
session_track_gtids=OFF
session_track_schema=ON
session_track_state_change=OFF
session_track_system_variables=time_zone,autocommit,character_set_client,character_set_results,character_set_connection
session_track_transaction_info=OFF
sha256_password_auto_generate_rsa_keys=ON
sha256_password_private_key_path=private_key.pem
sha256_password_proxy_users=OFF
sha256_password_public_key_path=public_key.pem
show_compatibility_56=OFF
show_old_temporals=OFF
skip_external_locking=ON
skip_name_resolve=ON
skip_networking=OFF
skip_show_database=OFF
slave_allow_batching=OFF
slave_checkpoint_group=512
slave_checkpoint_period=300
slave_compressed_protocol=OFF
slave_exec_mode=STRICT
slave_load_tmpdir=/mysql/tmp
slave_max_allowed_packet=1073741824
slave_net_timeout=30
slave_parallel_type=DATABASE
slave_parallel_workers=0
slave_pending_jobs_size_max=16777216
slave_preserve_commit_order=OFF
slave_rows_search_algorithms=TABLE_SCAN,INDEX_SCAN
slave_skip_errors=OFF
slave_sql_verify_checksum=ON
slave_transaction_retries=10
slave_type_conversions=
slow_launch_time=2
slow_query_log=ON
slow_query_log_file=/mysql/logs/slow.log
socket=/mysql/mysql.sock
sort_buffer_size=262144
sql_auto_is_null=OFF
sql_big_selects=ON
sql_buffer_result=OFF
sql_log_bin=ON
sql_log_off=OFF
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_notes=ON
sql_quote_show_create=ON
sql_safe_updates=OFF
sql_select_limit=18446744073709551615
sql_slave_skip_counter=0
sql_warnings=OFF
ssl_ca=/mysql/datadir/client_ca_cert.pem
ssl_capath=
ssl_cert=/mysql/datadir/server_cert.pem
ssl_cipher=ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA
ssl_crl=
ssl_crlpath=
ssl_key=/mysql/datadir/server_pkey.pem
stored_program_cache=256
super_read_only=OFF
sync_binlog=1
sync_frm=ON
sync_master_info=10000
sync_relay_log=10000
sync_relay_log_info=10000
system_time_zone=UTC
system_user_table=ON
table_definition_cache=1400
table_open_cache=2000
table_open_cache_instances=16
thread_cache_size=48
thread_handling=one-thread-per-connection
thread_stack=262144
time_format=%H:%i:%s
time_zone=SYSTEM
timestamp=1511213904.401692
tls_version=TLSv1,TLSv1.1,TLSv1.2
tmp_table_size=16777216
tmpdir=/mysql/tmp
transaction_alloc_block_size=8192
transaction_allow_batching=OFF
transaction_prealloc_size=4096
transaction_write_set_extraction=OFF
tx_isolation=REPEATABLE-READ
tx_read_only=OFF
unique_checks=ON
updatable_views_with_limit=YES
version=5.7.14-google-log
version_comment=(Google)
version_compile_machine=x86_64
version_compile_os=Linux
wait_timeout=28800
warning_count=0

And here is my "SHOW ENGINE INNODB STATUS" (It's offpeak time at the moment)

Per second averages calculated from the last 21 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 454 srv_active, 0 srv_shutdown, 18 srv_idle
srv_master_thread log flush and writes: 472
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 22416
OS WAIT ARRAY INFO: signal count 20532
RW-shared spins 0, rounds 23685, OS waits 11571
RW-excl spins 0, rounds 2629, OS waits 45
RW-sx spins 1, rounds 30, OS waits 1
Spin rounds per wait: 23685.00 RW-shared, 2629.00 RW-excl, 30.00 RW-sx
------------
TRANSACTIONS
------------
Trx id counter 923538034
Purge done for trx's n:o < 923538030 undo n:o < 0 state: running but idle
History list length 2188
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 375459551693520, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 375459551692608, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 375459551694432, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
 ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
132950 OS file reads, 17513 OS file writes, 11810 OS fsyncs
20.48 reads/s, 16384 avg bytes/read, 43.52 writes/s, 18.48 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 81, seg size 83, 110 merges
merged operations:
 insert 147, delete mark 5, delete 3
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 10092529, node heap has 119 buffer(s)
Hash table size 10092529, node heap has 41 buffer(s)
Hash table size 10092529, node heap has 29 buffer(s)
Hash table size 10092529, node heap has 1761 buffer(s)
Hash table size 10092529, node heap has 77 buffer(s)
Hash table size 10092529, node heap has 13 buffer(s)
Hash table size 10092529, node heap has 14 buffer(s)
Hash table size 10092529, node heap has 351 buffer(s)
3181.13 hash searches/s, 2702.35 non-hash searches/s
---
LOG
---
Log sequence number 231371250929
Log flushed up to   231371250912
Pages flushed up to 231371250069
Last checkpoint at  231371237449
0 pending log flushes, 0 pending chkp writes
9390 log i/o's done, 12.86 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 41778413568
Dictionary memory allocated 15070313
Buffer pool size   2490064
Free buffers       2352880
Database pages     134779
Old database pages 49908
Modified db pages  8
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 8, not young 0
0.05 youngs/s, 0.00 non-youngs/s
Pages read 132333, created 2446, written 7006
20.28 reads/s, 0.19 creates/s, 29.81 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 134779, unzip_LRU len: 0
I/O sum[0]:cur[1808], unzip sum[0]:cur[0]
----------------------
INDIVIDUAL BUFFER POOL INFO
----------------------
---BUFFER POOL 0
Buffer pool size   311258
Free buffers       294470
Database pages     16487
Old database pages 6106
Modified db pages  1
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 2, not young 0
0.05 youngs/s, 0.00 non-youngs/s
Pages read 16164, created 323, written 1314
2.67 reads/s, 0.05 creates/s, 7.29 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 16487, unzip_LRU len: 0
I/O sum[0]:cur[226], unzip sum[0]:cur[0]
---BUFFER POOL 1
Buffer pool size   311258
Free buffers       294680
Database pages     16281
Old database pages 6029
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 1, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 16022, created 259, written 593
2.14 reads/s, 0.00 creates/s, 1.81 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 16281, unzip_LRU len: 0
I/O sum[0]:cur[226], unzip sum[0]:cur[0]
---BUFFER POOL 2
Buffer pool size   311258
Free buffers       293338
Database pages     17627
Old database pages 6526
Modified db pages  1
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 3, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 17306, created 321, written 930
1.00 reads/s, 0.00 creates/s, 3.43 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 17627, unzip_LRU len: 0
I/O sum[0]:cur[226], unzip sum[0]:cur[0]
---BUFFER POOL 3
Buffer pool size   311258
Free buffers       294783
Database pages     16173
Old database pages 5990
Modified db pages  2
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 15824, created 349, written 1188
6.48 reads/s, 0.00 creates/s, 7.52 writes/s
Buffer pool hit rate 999 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 16173, unzip_LRU len: 0
I/O sum[0]:cur[226], unzip sum[0]:cur[0]
---BUFFER POOL 4
Buffer pool size   311258
Free buffers       294111
Database pages     16842
Old database pages 6237
Modified db pages  3
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 16515, created 327, written 847
2.48 reads/s, 0.00 creates/s, 2.14 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 16842, unzip_LRU len: 0
I/O sum[0]:cur[226], unzip sum[0]:cur[0]
---BUFFER POOL 5
Buffer pool size   311258
Free buffers       293676
Database pages     17285
Old database pages 6400
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 2, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 16974, created 311, written 499
2.38 reads/s, 0.00 creates/s, 0.29 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 17285, unzip_LRU len: 0
I/O sum[0]:cur[226], unzip sum[0]:cur[0]
---BUFFER POOL 6
Buffer pool size   311258
Free buffers       294669
Database pages     16286
Old database pages 6031
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 15999, created 287, written 816
1.29 reads/s, 0.14 creates/s, 4.38 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 16286, unzip_LRU len: 0
I/O sum[0]:cur[226], unzip sum[0]:cur[0]
---BUFFER POOL 7
Buffer pool size   311258
Free buffers       293153
Database pages     17798
Old database pages 6589
Modified db pages  1
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 17529, created 269, written 819
1.86 reads/s, 0.00 creates/s, 2.95 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 17798, unzip_LRU len: 0
I/O sum[0]:cur[226], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=1, Main thread ID=139645190752000, state: sleeping
Number of rows inserted 232159, updated 7538, deleted 72, read 74948240
1.14 inserts/s, 10.19 updates/s, 0.00 deletes/s, 62857.63 reads/s
  • 2
    Optimizer settings were too long ... optimizer_switch=index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on optimizer_trace_features=greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on – jcolebrand Nov 20 '17 at 22:39
  • 2
    It's what we do. Hope that helps readability and you were able to learn something from it. – jcolebrand Nov 20 '17 at 22:42
  • @DdD I see your variables but not the text results of SHOW GLOBAL STATUS; please add to original question when time permits for more thorough analysis. – Wilson Hauck Nov 22 '17 at 18:27
  • @WilsonHauck I wasn't able to fit it into the body, here's paste bin pastebin.com/RbR8szhe – DdD Nov 23 '17 at 1:02
  • @DdD Thanks for the GLOBAL STATUS. A question for you. Would you expect any negative results if you limited SELECT ... to 1M rows? Do you ever expect this kind of row volume in delivering data to your users? Would you consider using in your my.cnf/ini sql_select_limit = 1M to avoid 'runaway' SELECT attempt? – Wilson Hauck Nov 24 '17 at 22:18
0

73K tables is bad design and bad for performance. If you get it down to 2K, that might be reasonable.

There are a few settings that are caches for tables; they would be in the hundreds or a few thousand, but not 73K.

|improve this answer|||||
  • Thanks, the only time I may have an issue with tables is the users can make their own custom table solution to use along side their data; but they are never accessed that frequently because they are synced onto the Mobile App - so that shouldn't really be much of a problem. I will work on getting my table count down. – DdD Nov 20 '17 at 23:45
  • After running some numbers, it looks like its possible to get it down to 1761, and potentially even 1200 tables if I do some cleaning up from clients who no longer use us - I've already managed to get all of the CRM data into just 20 tables in about 20 minutes or so, so that part is easy now its just fixing the queries; I should be able to get the table usage much better pretty fast just need to do some vigorous testing to make sure there are not side-effects. Any other recommended optimisations ? – DdD Nov 21 '17 at 3:26
  • @DdD - Good. Check the indexes, too. Keep file_per_table=ON, especially now that you have fewer, bigger, tables. After the new tables have been in place for at least a day, get more tuning analysis: mysql.rjweb.org/doc.php/mysql_analysis#tuning – Rick James Nov 21 '17 at 3:44
  • It'll take quite some time until I can get it running, I'm hoping I can get a complete swap over within the next week or two, then I'll keep analysing. The indexes should be ok, I only had to add an extra index when going from the multi-table to 1 table; which works out great, the IOPS should hold up great - but I'll be able to find out once I've done the complete swap-over. – DdD Nov 21 '17 at 4:07
  • 1
    Having customer_id first in the PRIMARY KEY will help performance. – Rick James Nov 21 '17 at 19:45
2

Essentially, each customer has their own set of tables for the CRM, these tables are almost all very similar, except that it just holds data unique to them. With a bit of refactoring, I could very easily copy data across to only a few tables with a huge amount of rows (Which means I could probably drop near 71000 tables). However I would like thoughts and opinions on this, a lot of data and actions happen in the CRM so I figured the look ups would be much quicker since there would be less need for using multiple keys.

As a general rule, multi-tenant solutions should not be implement with tables. There is nothing that gives me any reason to believe this general rule isn't applicable here.

You have a natural composite key that includes customer_id. It makes no more sense to segment it into tables on the basis of that, then on any other id field.

|improve this answer|||||
  • Yeah, I will work on getting the data merged into a smaller set of tables – DdD Nov 20 '17 at 23:45
  • 1
    +1 for the natural composite key containing customer_id. I work with multiple tables having millions of rows (which is still a relatively small quantity) and queries to those tables are always lightning fast for any querying using the first part of the composite key. Lightning fast is defined here as not showing up in my slow query log with a long_query_time=0.03 seconds. – Willem Renzema Nov 21 '17 at 11:21

Not the answer you're looking for? Browse other questions tagged or ask your own question.