단일 테이블 쿼리 속도가 매우 느림(인덱스 사용 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_reviews
admin_id
, 「동등하게 해 주세요」active
★★★★★★★★★★★★★★★★★」posted at
됩니다.products
rate
,product_id
, , , , 입니다.site
.
이 커버링 인덱스를 사용해 보세요.
CREATE INDEX rate_product_site_rollup ON products_review
(admin_id, posted_at, active, rate, product_id, site);
문서에는 되어 있습니다.products_review
table.시키기 위해 를 첫 행(「」 「」 「」 「」 「」 「」 「」)에 으로 액세스 할 수 .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'
"제품은 단지 일종의 사용일 뿐입니다.정말 필요없으면 버리세요.두 가지 중요한 점이 있습니다.
- 일치하는 행이 없는 경우
products
그JOIN
그것을 포함시키지 않을 것이다. - 에 여러 행이 있는 경우
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
'programing' 카테고리의 다른 글
Java 8의 기본 가비지 수집기 (0) | 2023.01.01 |
---|---|
봄 JPA @LIKE와 함께 쿼리 (0) | 2023.01.01 |
개체의 현재 속성 및 값을 모두 인쇄하는 기능이 내장되어 있습니까? (0) | 2023.01.01 |
GROUP_CONCAT 제한 있음 (0) | 2023.01.01 |
"set Same Site cookie to none" 경고를 수정하는 방법 (0) | 2022.12.27 |