programing

단일 테이블 쿼리 속도가 매우 느림(인덱스 사용 MariaDB

luckcodes 2023. 1. 1. 12:10

단일 테이블 쿼리 속도가 매우 느림(인덱스 사용 MariaDB

실행 속도가 느린 쿼리를 조정하려고 합니다.MariaDB 취급하고 무엇을 있는지 알 수.포스트그레스/오라클이러한 쿼리 시간은 매우 느린 것 같습니다만, 무엇을 빠뜨리고 있는지 알 수 없습니다.

문제의 쿼리(아래 예 참조)는 대부분 단일 테이블 쿼리이거나 조인/서브쿼리가 1개 포함되어 있습니다.문제의 테이블에는 약 1900만 행(26.5GB)이 있으며 쓰기 빈도가 상당히 높습니다.

아래 표 구조 및 색인:

CREATE TABLE products_reviews (
    id bigint(20) NOT NULL AUTO_INCREMENT
,   product_id int(11) NOT NULL DEFAULT 0
,   name varchar(255) NOT NULL DEFAULT ''
,   rate tinyint(4) NOT NULL DEFAULT 0
,   created_at datetime NOT NULL
,   posted_at date NOT NULL
,   site varchar(50) NOT NULL
,   review text NOT NULL
,   details text DEFAULT NULL
,   type smallint(6) NOT NULL DEFAULT 0
,  notify smallint(6) NOT NULL DEFAULT 1
,   notify_daily int(11) NOT NULL DEFAULT 1
,   user_id int(11) DEFAULT NULL
,   updated_at datetime NOT NULL
,   admin_id int(11) DEFAULT NULL
,   status smallint(6) NOT NULL DEFAULT 0
,   comment text NOT NULL
,   notified_at datetime NOT NULL
,   reply tinyint(4) NOT NULL DEFAULT 0
,   syndicate varchar(100) NOT NULL
,   status_user tinyint(4) NOT NULL
,   reviewer_id varchar(100) NOT NULL DEFAULT ''
,  sentiment text DEFAULT NULL
,   sentiment_score float(5,2) NOT NULL DEFAULT 0.00
,   ai text DEFAULT NULL
,   active tinyint(4) NOT NULL DEFAULT 1
,   active_updated_at datetime NOT NULL DEFAULT current_timestamp()
,   review_translate text NOT NULL
,   price float(6,2) NOT NULL
,   tagging text NOT NULL
,   site_id int(11) NOT NULL
,   hash varchar(255) NOT NULL
,   PRIMARY KEY (id)
,   KEY created_at (created_at)
,   KEY posted_at (posted_at)
,   KEY site (site)
,   KEY product_id (product_id)
,   KEY admin_id (admin_id)
,   KEY type (type)
,   KEY notify (notify)
,   KEY active (active)
,   KEY admin_posted (admin_id,posted_at)
,   KEY reviewer_id (reviewer_id)
,   KEY idx_products_reviews_pspth (product_id,site,posted_at,type,hash)
,   KEY idx_products_reviews_pa (product_id,active)
,   KEY idx_products_reviews_product_posted (product_id,posted_at)
,   KEY idx_products_reviews_product_adminid_postedid (product_id,admin_id,posted_at)
,   KEY product_id_2 (product_id,site,active) 
) ENGINE=InnoDB AUTO_INCREMENT=27316062 DEFAULT CHARSET=utf8

아래 Mariadb 설정:

alter_algorithm DEFAULT 
aria_block_size 8192    
aria_checkpoint_interval    30  
aria_checkpoint_log_activity    1048576 
aria_encrypt_tables OFF 
aria_force_start_after_recovery_failures    0   
aria_group_commit   none    
aria_group_commit_interval  0   
aria_log_file_size  1073741824  
aria_log_purge_type immediate   
aria_max_sort_file_size 9223372036853727232 
aria_page_checksum  ON  
aria_pagecache_age_threshold    300 
aria_pagecache_buffer_size  134217728   
aria_pagecache_division_limit   100 
aria_pagecache_file_hash_size   512 
aria_recover_options    BACKUP,QUICK    
aria_repair_threads 1   
aria_sort_buffer_size   268434432   
aria_stats_method   nulls_unequal   
aria_sync_log_dir   NEWFILE 
aria_used_for_temp_tables   ON  
auto_increment_increment    1   
auto_increment_offset   1   
autocommit  ON  
automatic_sp_privileges ON  
back_log    100 
basedir /usr    
big_tables  OFF 
binlog_annotate_row_events  ON  
binlog_cache_size   32768   
binlog_checksum CRC32   
binlog_commit_wait_count    0   
binlog_commit_wait_usec 100000  
binlog_direct_non_transactional_updates OFF 
binlog_file_cache_size  16384   
binlog_format   MIXED   
binlog_optimize_thread_scheduling   ON  
binlog_row_image    FULL    
binlog_stmt_cache_size  32768   
bulk_insert_buffer_size 8388608 
check_constraint_checks ON  
column_compression_threshold    100 
column_compression_zlib_level   6   
column_compression_zlib_strategy    DEFAULT_STRATEGY    
column_compression_zlib_wrap    OFF 
completion_type NO_CHAIN    
concurrent_insert   AUTO    
connect_timeout 10  
core_file   OFF 
date_format %Y-%m-%d    
datetime_format %Y-%m-%d %H:%i:%s   
deadlock_search_depth_long  15  
deadlock_search_depth_short 4   
deadlock_timeout_long   50000000    
deadlock_timeout_short  10000   
debug_no_thread_alarm   OFF 
default_master_connection       
default_regex_flags     
default_storage_engine  InnoDB  
default_tmp_storage_engine  MyISAM  
default_week_format 0   
delay_key_write ON  
delayed_insert_limit    100 
delayed_insert_timeout  300 
delayed_queue_size  1000    
div_precision_increment 4   
encrypt_binlog  OFF 
encrypt_tmp_disk_tables OFF 
encrypt_tmp_files   OFF 
enforce_storage_engine      
eq_range_index_dive_limit   0   
error_count 0   
event_scheduler OFF 
expensive_subquery_limit    100 
expire_logs_days    7   
explicit_defaults_for_timestamp OFF 
external_user       
extra_max_connections   1   
extra_port  0   
flush   OFF 
flush_time  0   
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 
group_concat_max_len    1048576 
gtid_binlog_pos     
gtid_binlog_state       
gtid_current_pos        
gtid_domain_id  0   
gtid_ignore_duplicates  OFF 
gtid_pos_auto_engines       
gtid_seq_no 0   
gtid_slave_pos      
gtid_strict_mode    OFF 
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    DISABLED    
have_symlink    YES 
histogram_size  0   
histogram_type  SINGLE_PREC_HB  
host_cache_size 633 
identity    0   
idle_readonly_transaction_timeout   0   
idle_transaction_timeout    0   
idle_write_transaction_timeout  0   
ignore_builtin_innodb   OFF 
ignore_db_dirs      
in_predicate_conversion_threshold   1000    
in_transaction  0   
init_connect        
init_file       
init_slave      
innodb_adaptive_flushing    ON  
innodb_adaptive_flushing_lwm    10.000000   
innodb_adaptive_hash_index  ON  
innodb_adaptive_hash_index_parts    8   
innodb_adaptive_max_sleep_delay 150000  
innodb_autoextend_increment 64  
innodb_autoinc_lock_mode    1   
innodb_background_scrub_data_check_interval 3600    
innodb_background_scrub_data_compressed OFF 
innodb_background_scrub_data_interval   604800  
innodb_background_scrub_data_uncompressed   OFF 
innodb_buf_dump_status_frequency    0   
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 68719476736 
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_algorithm    zlib    
innodb_compression_default  OFF 
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_deadlock_detect  ON  
innodb_default_encryption_key_id    1   
innodb_default_row_format   dynamic 
innodb_disable_sort_file_cache  OFF 
innodb_disallow_writes  OFF 
innodb_doublewrite  ON  
innodb_encrypt_log  OFF 
innodb_encrypt_tables   OFF 
innodb_encrypt_temporary_tables OFF 
innodb_encryption_rotate_key_age    1   
innodb_encryption_rotation_iops 100 
innodb_encryption_threads   0   
innodb_fast_shutdown    1   
innodb_fatal_semaphore_wait_threshold   600 
innodb_file_format      
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 fsync   

innodb_flush_neighbors  1   
innodb_flush_sync   ON  
innodb_flushing_avg_loops   30  
innodb_force_load_corrupted OFF 
innodb_force_primary_key    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_idle_flush_pct   100 
innodb_immediate_scrub_data_uncompressed    OFF 
innodb_io_capacity  1000    
innodb_io_capacity_max  2000    
innodb_large_prefix     
innodb_lock_schedule_algorithm  fcfs    
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    50331648    
innodb_log_files_in_group   2   
innodb_log_group_home_dir   ./  
innodb_log_optimize_ddl ON  
innodb_log_write_ahead_size 8192    
innodb_lru_scan_depth   1024    
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    10485760    
innodb_monitor_disable      
innodb_monitor_enable       
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   4096    
innodb_optimize_fulltext_only   OFF 
innodb_page_cleaners    4   
innodb_page_size    16384   
innodb_prefix_index_cluster_optimization    OFF 
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_scrub_log    OFF 
innodb_scrub_log_speed  256 
innodb_sort_buffer_size 1048576 
innodb_spin_wait_delay  4   
innodb_stats_auto_recalc    ON  
innodb_stats_include_delete_marked  OFF 
innodb_stats_method nulls_equal 
innodb_stats_modified_counter   0   
innodb_stats_on_metadata    OFF 
innodb_stats_persistent ON  
innodb_stats_persistent_sample_pages    20  
innodb_stats_sample_pages   8   
innodb_stats_traditional    ON  
innodb_stats_transient_sample_pages 8   
innodb_status_output    OFF 
innodb_status_output_locks  OFF 
innodb_strict_mode  OFF 
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_atomic_writes    ON  
innodb_use_native_aio   ON  
innodb_version  10.3.21 
innodb_write_io_threads 4   
insert_id   0   
interactive_timeout 3600    
join_buffer_size    1048576 
join_buffer_space_limit 2097152 
join_cache_level    2   

keep_files_on_create    OFF 
key_buffer_size 67108864    
key_cache_age_threshold 300 
key_cache_block_size    1024    
key_cache_division_limit    100 
key_cache_file_hash_size    512 
key_cache_segments  0   
large_files_support ON  
large_page_size 0   
large_pages OFF 
last_gtid       
last_insert_id  0   
lc_messages en_US   
lc_messages_dir     
lc_time_names   en_US   
license GPL 
local_infile    ON  
lock_wait_timeout   86400   
locked_in_memory    OFF 
log_bin OFF 
log_bin_basename        
log_bin_compress    OFF 
log_bin_compress_min_len    256 
log_bin_index       
log_bin_trust_function_creators OFF 
log_disabled_statements sp  
log_error   /var/log/mariadb/mariadb.log    
log_output  FILE    
log_queries_not_using_indexes   OFF 
log_slave_updates   OFF 
log_slow_admin_statements   ON  
log_slow_disabled_statements    sp  
log_slow_filter admin,filesort,filesort_on_disk,filesort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk    
log_slow_rate_limit 1   
log_slow_slave_statements   ON  
log_slow_verbosity      
log_tc_size 24576   
log_warnings    2   
long_query_time 1.000000    
low_priority_updates    OFF 
lower_case_file_system  OFF 
lower_case_table_names  0   
master_verify_checksum  OFF 
max_allowed_packet  67108864    
max_binlog_cache_size   18446744073709547520    
max_binlog_size 1073741824  
max_binlog_stmt_cache_size  18446744073709547520    
max_connect_errors  10000   
max_connections 600 
max_delayed_threads 20  
max_digest_length   1024    
max_error_count 64  
max_heap_table_size 67108864    
max_insert_delayed_threads  20  
max_join_size   18446744073709551615    
max_length_for_sort_data    1024    
max_long_data_size  67108864    
max_prepared_stmt_count 16382   
max_recursive_iterations    4294967295  
max_relay_log_size  1073741824  
max_seeks_for_key   4294967295  
max_session_mem_used    9223372036854775807 
max_sort_length 1024    
max_sp_recursion_depth  0   
max_statement_time  0.000000    
max_tmp_tables  32  
max_user_connections    0   
max_write_lock_count    4294967295  
metadata_locks_cache_size   1024    
metadata_locks_hash_instances   8   
min_examined_row_limit  0   
mrr_buffer_size 262144  
multi_range_count   256 
myisam_block_size   1024    
myisam_data_pointer_size    6   
myisam_max_sort_file_size   9223372036853727232 
myisam_mmap_size    18446744073709551615    
myisam_recover_options  BACKUP,QUICK    
myisam_repair_threads   1   
myisam_sort_buffer_size 134217728   
myisam_stats_method NULLS_UNEQUAL   
myisam_use_mmap OFF 
mysql56_temporal_format ON  
net_buffer_length   16384   
net_read_timeout    30  
net_retry_count 10  
net_write_timeout   60  
open_files_limit    65535   
optimizer_prune_level   1   
optimizer_search_depth  62  
optimizer_selectivity_sampling_limit    100 
optimizer_switch    index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=on,derived_merge=on,derived_with_keys=on,firstmatch=on,loosescan=on,materialization=on,in_to_exists=on,semijoin=on,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=on,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=on,semijoin_with_cache=on,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,table_elimination=on,extended_keys=on,exists_to_in=on,orderby_uses_equalities=on,condition_pushdown_for_derived=on,split_materialized=on  
optimizer_use_condition_selectivity 1   
performance_schema  OFF 
performance_schema_accounts_size    -1  
performance_schema_digests_size -1  

performance_schema_events_stages_history_long_size  -1  
performance_schema_events_stages_history_size   -1  
performance_schema_events_statements_history_long_size  -1  
performance_schema_events_statements_history_size   -1  
performance_schema_events_waits_history_long_size   -1  
performance_schema_events_waits_history_size    -1  
performance_schema_hosts_size   -1  
performance_schema_max_cond_classes 80  
performance_schema_max_cond_instances   -1  
performance_schema_max_digest_length    1024    
performance_schema_max_file_classes 50  
performance_schema_max_file_handles 32768   
performance_schema_max_file_instances   -1  
performance_schema_max_mutex_classes    200 
performance_schema_max_mutex_instances  -1  
performance_schema_max_rwlock_classes   40  
performance_schema_max_rwlock_instances -1  
performance_schema_max_socket_classes   10  
performance_schema_max_socket_instances -1  
performance_schema_max_stage_classes    160 
performance_schema_max_statement_classes    200 
performance_schema_max_table_handles    -1  
performance_schema_max_table_instances  -1  
performance_schema_max_thread_classes   50  
performance_schema_max_thread_instances -1  
performance_schema_session_connect_attrs_size   -1  
performance_schema_setup_actors_size    100 
performance_schema_setup_objects_size   100 
performance_schema_users_size   -1  
pid_file    /var/run/mariadb/mariadb.pid    
plugin_dir  /usr/lib64/mysql/plugin/    
plugin_maturity gamma   
port    3306    
preload_buffer_size 32768   
profiling   OFF 
profiling_history_size  15  
progress_report_time    5   
protocol_version    10  
proxy_protocol_networks     
proxy_user      
pseudo_slave_mode   OFF 
pseudo_thread_id    1852681 
query_alloc_block_size  16384   
query_cache_limit   1048576 
query_cache_min_res_unit    4096    
query_cache_size    1048576 
query_cache_strip_comments  OFF 
query_cache_type    OFF 
query_cache_wlock_invalidate    OFF 
query_prealloc_size 24576   
rand_seed1  93838501    
rand_seed2  36662033    
range_alloc_block_size  4096    
read_binlog_speed_limit 0   
read_buffer_size    1048576 
read_only   OFF 
read_rnd_buffer_size    1048576 
relay_log       
relay_log_basename      
relay_log_index     
relay_log_info_file relay-log.info  
relay_log_purge ON  
relay_log_recovery  OFF 
relay_log_space_limit   17179869184 
replicate_annotate_row_events   ON  
replicate_do_db     
replicate_do_table      
replicate_events_marked_for_skip    REPLICATE   
replicate_ignore_db     
replicate_ignore_table      
replicate_wild_do_table     
replicate_wild_ignore_table     
report_host     
report_password     
report_port 3306    
report_user     
rowid_merge_buff_size   8388608 
secure_auth ON  
secure_file_priv        
secure_timestamp    NO  
server_id   1   
session_track_schema    ON  
session_track_state_change  OFF 
session_track_system_variables  autocommit,character_set_client,character_set_connection,character_set_results,time_zone    
session_track_transaction_info  OFF 
skip_external_locking   ON  
skip_name_resolve   ON  
skip_networking OFF 
skip_parallel_replication   OFF 
skip_replication    OFF 
skip_show_database  OFF 

slave_compressed_protocol   OFF 
slave_ddl_exec_mode IDEMPOTENT  
slave_domain_parallel_threads   0   
slave_exec_mode STRICT  
slave_load_tmpdir   /san/svc-fs/mysqltmp    
slave_max_allowed_packet    1073741824  
slave_net_timeout   60  
slave_parallel_max_queued   131072  
slave_parallel_mode conservative    
slave_parallel_threads  0   
slave_parallel_workers  0   
slave_run_triggers_for_rbr  NO  
slave_skip_errors   OFF 
slave_sql_verify_checksum   ON  
slave_transaction_retries   10  
slave_transaction_retry_errors  1213,1205   
slave_transaction_retry_interval    0   
slave_type_conversions      
slow_launch_time    2   
slow_query_log  ON  
slow_query_log_file /san/svc-fs/mysqllogs/slow-log  
socket  /san/svc-fs/mysql/mysql.sock    
sort_buffer_size    1048576 
sql_auto_is_null    OFF 
sql_big_selects ON  
sql_buffer_result   OFF 
sql_log_bin ON  
sql_log_off OFF 
sql_mode    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      
ssl_capath      
ssl_cert        
ssl_cipher      
ssl_crl     
ssl_crlpath     
ssl_key     
standard_compliant_cte  ON  
storage_engine  InnoDB  
stored_program_cache    256 
strict_password_validation  ON  
sync_binlog 0   
sync_frm    ON  
sync_master_info    10000   
sync_relay_log  10000   
sync_relay_log_info 10000   
system_time_zone    CST 
system_versioning_alter_history ERROR   
system_versioning_asof  DEFAULT 
table_definition_cache  4096    
table_open_cache    4096    
table_open_cache_instances  8   
tcp_keepalive_interval  0   
tcp_keepalive_probes    0   
tcp_keepalive_time  0   
thread_cache_size   16  
thread_concurrency  10  
thread_handling one-thread-per-connection   
thread_pool_idle_timeout    60  
thread_pool_max_threads 65536   
thread_pool_oversubscribe   3   
thread_pool_prio_kickup_timer   1000    
thread_pool_priority    auto    
thread_pool_size    16  
thread_pool_stall_limit 500 
thread_stack    299008  
time_format %H:%i:%s    
time_zone   SYSTEM  
timed_mutexes   OFF 
timestamp   1644789513.087889   
tmp_disk_table_size 18446744073709551615    
tmp_memory_table_size   33554432    
tmp_table_size  33554432    
tmpdir  /san/svc-fs/mysqltmp    
transaction_alloc_block_size    8192    
transaction_prealloc_size   4096    
tx_isolation    REPEATABLE-READ 
tx_read_only    OFF 
unique_checks   ON  
updatable_views_with_limit  YES 
use_stat_tables NEVER   
userstat    OFF 
version 10.3.21-MariaDB-log 
version_comment MariaDB Server  
version_compile_machine x86_64  
version_compile_os  Linux   
version_malloc_library  jemalloc 3.6.0-0-g46c0af68bd248b04df75e4f92d5fb804c3d75340  
version_source_revision e5e5877740f248de848219ee3a1d2881cd5c5b82    
version_ssl_library OpenSSL 1.0.2k-fips  26 Jan 2017    
wait_timeout    600 
warning_count   0   
wsrep_osu_method    TOI 
wsrep_auto_increment_control    ON  
wsrep_causal_reads  OFF 
wsrep_certification_rules   strict  

wsrep_certify_nonpk ON  
wsrep_cluster_address       
wsrep_cluster_name  my_wsrep_cluster    
wsrep_convert_lock_to_trx   OFF 
wsrep_data_home_dir /san/svc-fs/mysql/  
wsrep_dbug_option       
wsrep_debug OFF 
wsrep_desync    OFF 
wsrep_dirty_reads   OFF 
wsrep_drupal_282555_workaround  OFF 
wsrep_forced_binlog_format  NONE    
wsrep_gtid_domain_id    0   
wsrep_gtid_mode OFF 
wsrep_load_data_splitting   ON  
wsrep_log_conflicts OFF 
wsrep_max_ws_rows   0   
wsrep_max_ws_size   2147483647  
wsrep_mysql_replication_bundle  0   
wsrep_node_address      
wsrep_node_incoming_address AUTO    
wsrep_notify_cmd        
wsrep_on    OFF 
wsrep_patch_version wsrep_25.24 
wsrep_provider  none    
wsrep_provider_options      
wsrep_recover   OFF 
wsrep_reject_queries    NONE    
wsrep_replicate_myisam  OFF 
wsrep_restart_slave OFF 
wsrep_retry_autocommit  1   
wsrep_slave_fk_checks   ON  
wsrep_slave_uk_checks   OFF 
wsrep_slave_threads 1   
wsrep_sst_auth      
wsrep_sst_donor     
wsrep_sst_donor_rejects_queries OFF 
wsrep_sst_method    rsync   
wsrep_sst_receive_address   AUTO    
wsrep_start_position    00000000-0000-0000-0000-000000000000:-1 
wsrep_sync_wait 0   

쿼리 필터는 사용자가 프런트 엔드에서 선택할 수 있으므로 where 구는 약간 다를 수 있습니다.적어도 모두 product_id가 포함됩니다.가져올 행 수에 비해 디스크에서 읽는 속도가 터무니없이 느립니다.

쿼리 예시:이것은 돌아오는 데 400초가 걸린다.

편집 - 아래 쿼리의 형식이 잘못되었습니다. 게시물을 작성할 때 발생했을 수 있습니다.원본은 다음과 같습니다.

SELECT SQL_NO_CACHE 
       pr.rate as star, pr.product_id, pr.site, COUNT(pr.id) AS count 
  FROM products_reviews pr
   JOIN products p ON p.id = pr.product_id
   AND pr.active > 0 
   AND pr.posted_at >= '2020-10-26' 
   AND pr.posted_at <= '2022-01-24 23:59' 
   AND pr.admin_id = 3598 
 GROUP BY pr.rate, pr.product_id, pr.site;
SELECT rate as star, product_id, site, COUNT(id) AS count 
  FROM products_reviews 
 WHERE product_id IN (SELECT id FROM products WHERE admin_id = 3598) 
   AND active >0 AND posted_at >= '2020-10-26' 
   AND posted_at <= '2022-01-24 23:59'
   AND admin_id = 3598
 GROUP BY rate, product_id, site

계획을 설명하다

{
 "query_block": {
   "select_id": 1,
   "filesort": {
     "sort_key": "products_reviews.rate, products_reviews.product_id, products_reviews.site",
     "temporary_table": {
       "table": {
         "table_name": "products_reviews",
         "access_type": "range",
         "possible_keys": [
           "posted_at",
           "product_id",
           "admin_id",
           "active",
           "admin_posted",
           "idx_products_reviews_pspth",
           "idx_products_reviews_pa",
           "idx_products_reviews_product_posted",
           "idx_products_reviews_product_adminid_postedid",
           "product_id_2",
           "idx_products_aaprps_covering",
           "idx_products_aprps_covering_t"
         ],
         "key": "idx_products_aaprps_covering",
         "key_length": "6",
         "used_key_parts": ["admin_id", "active"],
         "rows": 1826162,
         "filtered": 100,
         "attached_condition": "products_reviews.admin_id = 3598 and products_reviews.active > 0 and products_reviews.posted_at >= '2020-10-26' and products_reviews.posted_at <= '2022-01-24 23:59'",
         "using_index": true
       },
       "table": {
         "table_name": "products",
         "access_type": "eq_ref",
         "possible_keys": ["PRIMARY", "id", "admin_id"],
         "key": "PRIMARY",
         "key_length": "8",
         "used_key_parts": ["id"],
         "ref": ["metabase.products_reviews.product_id"],
         "rows": 1,
         "filtered": 100,
         "attached_condition": "products.admin_id = 3598 and products_reviews.product_id = products.`id`"
       }
     }
   }
 }
}

트랜잭션에 대한 프로파일링을 실행했는데, 전체 시간이 "데이터 전송"에 소요됩니다.

다음은 두 번째 질문입니다.이 질문에는 약 32초 걸립니다.

SELECT site, MIN(posted_at) as posted_at, AVG(IF(rate>0, rate, NULL)) as rate, COUNT(IF(type=0, 1, NULL)) as count, COUNT(IF(type=0 AND syndicate='', 1, NULL)) as count_ns, AVG(IF(rate>0 AND syndicate='', rate, NULL)) as rate_ns, COUNT(IF(type=1, 1, NULL)) as count_qe 
  FROM products_reviews 
 WHERE product_id = '24828' 
   AND active >0 
 GROUP BY site

계획 설명

{
 "query_block": {
   "select_id": 1,
   "table": {
     "table_name": "products_reviews",
     "access_type": "ref",
     "possible_keys": [
       "product_id",
       "active",
       "idx_products_reviews_pspth",
       "idx_products_reviews_pa",
       "idx_products_reviews_product_posted",
       "idx_products_reviews_product_adminid_postedid",
       "product_id_2"
     ],
     "key": "product_id_2",
     "key_length": "4",
     "used_key_parts": ["product_id"],
     "ref": ["const"],
     "rows": 6575,
     "filtered": 100,
     "attached_condition": "products_reviews.product_id <=> '24828' and products_reviews.active > 0"
   }
 }
{
 "query_block": {
   "select_id": 1,
   "table": {
     "table_name": "products_reviews",
     "access_type": "ref",
     "possible_keys": [
       "product_id",
       "active",
       "idx_products_reviews_pspth",
       "idx_products_reviews_pa",
       "idx_products_reviews_product_posted",
       "idx_products_reviews_product_adminid_postedid",
       "product_id_2"
     ],
     "key": "product_id_2",
     "key_length": "4",
     "used_key_parts": ["product_id"],
     "ref": ["const"],
     "rows": 6575,
     "filtered": 100,
     "attached_condition": "products_reviews.product_id <=> '24828' and products_reviews.active > 0"
   }
 }
}

카디널리티와 부분적으로 관련이 있을 수 있습니다.입니다. 구별되는 행의 개수입니다.product_id 구별하다posted_at.

count(*) 19128090
count(distinct(product_id)) 28821
count(distinct(posted_at)) 7551

96GB RAM, 480GB SATA SSD.버퍼 풀 설정이 최적화되어 있는 것 같습니다.innodb_io_capacity이치노

쿼리 튜닝이나 파라미터 튜닝에 대해 쿼리 속도를 높이기 위해 할 수 있는 일이 없을 경우 테이블을 항상 메모리에 보관해야 한다는 생각이 들었습니다.적어도 하루에 한 번(아마 백업을 할 때쯤) 플러시됩니다.테이블에서 *을(를) 선택하기 위해 몇 시간마다 한 번씩 실행되는 일을 하는 것이 현명할까요?

대단히 고맙습니다.

좋은 질문입니다.제 답변에는 몇 가지 차원이 있습니다.

서버 프로비저닝:사용 중인 시스템이 적절하며 과도하게 프로비저닝될 수 있습니다.서버 RAM의 2/3을 64GiB InnoDB 버퍼 풀(innodb_buffer_pool_size)에 할당했습니다.이 정도면 테이블을 유지할 수 있을 것입니다.다른 8~12 GiB를 할당할 수 있지만 서버의 다른 기능에는 RAM이 남아 있습니다.그러나 버퍼 풀의 크기는 거의 문제가 되지 않습니다.

많은 인덱스:단일 열 인덱스가 꽤 많습니다.그것들이 모두 필요한 것이 맞습니까?일반적으로 특정 쿼리 패턴을 지원하는 인덱스를 만듭니다.언젠가 도움이 될 수 있기 때문이 아닙니다.일부 인덱스를 삭제할 수 있는 경우 삭제합니다.또한 테이블 데이터와 인덱스가 모두 영향을 받기 때문에 인덱스는 INSERT 및 UPDATE 속도를 늦춥니다.그래서 우리는...

빈번한 갱신:업데이트 실행 시 서버가 일관된 결과(잠금 사용)를 제공하는 데 어려움을 겪고 있기 때문에 업데이트 작업에서 질문에서 보여 준 보고 스타일의 쿼리가 느려질 수 있습니다.속도가 너무 느린 쿼리 직전에 이 SQL 문을 지정하십시오.

   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

이로 인해 "더러운 읽기"가 발생합니다.잠금 기능은 줄어들지만 현재 업데이트 중인 행의 이전 버전을 얻을 수 있습니다.일반적으로 보고서 형식의 쿼리에는 문제가 없습니다.먹어보고 얼마나 도움이 되는지 보세요.

BTREE 인덱스를 커버하는 등가 필터와 범위 필터.여기서 반복되는 첫 번째 쿼리를 생각해 보십시오.

SELECT SQL_NO_CACHE 
       pr.rate as star, pr.product_id, pr.site, COUNT(pr.id) AS count 
  FROM products_reviews pr
  JOIN products p ON p.id = pr.product_id
   AND pr.active > 0 
   AND pr.posted_at >= '2020-10-26' 
   AND pr.posted_at <= '2022-01-24 23:59' 
   AND pr.admin_id = 3598 
 GROUP BY pr.rate, pr.product_id, pr.site;

.product_reviewsadmin_id , 「동등하게 해 주세요」active ★★★★★★★★★★★★★★★★★」posted at됩니다.productsrate,product_id , , , , 입니다.site.

커버링 인덱스를 사용해 보세요.

CREATE INDEX rate_product_site_rollup ON products_review
             (admin_id, posted_at, active, rate, product_id, site);

문서에는 되어 있습니다.products_reviewtable.시키기 위해 를 첫 행(「」 「」 「」 「」 「」 「」 「」)에 으로 액세스 할 수 .admin_id= 및첫 적격 = nnnnposted_at 수 .active<= 0 > 그룹화에 .마지막으로 GROUP BY 열은 빠른 그룹화에 적합한 순서로 이미 정렬되어 있습니다.

두 번째 쿼리에 대해서도 비슷한 커버리지 인덱스를 고려할 수 있습니다.

( 및 ( 「 」 )가 허가됩니다.INCLUDE(col, col, col)MariaDB/MySQL maria maria maria maria 。 INCLUDE인덱스를 커버하는 데 매우 유용하지만 인덱스에 열을 포함시키는 것도 효과적입니다.)

복수의 범위 필터: BTREE 인덱스는 쿼리에 범위 필터가1개밖에 없는 경우에 가장 빠르게 동작합니다.비즈니스 규칙에 따라 필터링할 수 있는 경우pr.active = 1그러면 이 인덱스가 더 빨리 쿼리를 충족할 수 있습니다.

CREATE INDEX rate_product_site_rollup ON products_review
             (admin_id, active, posted_at, rate, product_id, site);

무관한 참여: 자신의 참여에 대한products테이블에서 열을 사용하지 마십시오.따라서 JOIN은 오직 하나의 목적으로만 사용할 수 있습니다. 일치하는 제품이 없는 리뷰를 제외하는 것입니다.이차차 요요? ???

주의:pr.posted_at < '2022-01-24' + INTERVAL 1 DAY,와 함께<엣지 케이스에서는, 보다 신뢰성이 높아집니다.pr.posted_at <= '2022-01-24 23:59'

"제품은 단지 일종의 사용일 뿐입니다.정말 필요없으면 버리세요.두 가지 중요한 점이 있습니다.

  • 일치하는 행이 없는 경우productsJOIN그것을 포함시키지 않을 것이다.
  • 에 여러 행이 있는 경우products, 그 다음에COUNT증가할 것입니다.

교체하다

JOIN products p ON p.id = pr.product_id
 AND

와 함께

WHERE

원칙:

  • 사용하다ON테이블의 관련성을 지정합니다.
  • 사용하다WHERE유지할 행을 지정합니다.

다른 인덱스 팁:필요할 때INDEX(a,b), 없이 할 수 있습니다.INDEX(a)생각나는 건(admin_id, posted_at)

한다면active"0" 또는 "1"일 뿐입니다.AND active = 1, 및 로의 변경INDEX(admin_id, active, posted_at)

"인덱스는 하나의 동등 연산자만 포함할 수 있습니다." - 규칙은 "인덱스는 하나의 범위 연산자만 포함해야 하며 마지막이어야 합니다."에 가깝습니다. (참고: "커버링"은 의도적인 예외입니다.)

('커버링' 인덱스가 도움이 될 수 있다는 점은 동의하지만 일반적으로 열이 많은 인덱스는 피합니다.)

저는 (RLOG가 언급한) MariaDB 링크의 마스터를 가지고 있습니다.여기서 몇 번 갱신되었습니다.http://mysql.rjweb.org/doc.php/index_cookbook_mysql

언급URL : https://stackoverflow.com/questions/71108622/single-table-queries-very-slow-with-indexes-mariadb