database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 27964 게시물 읽기
No. 27964
단순 쿼리 속도가 너무 느립니다.
작성자
안중경(systemfile)
작성일
2009-01-07 18:27
조회수
6,129

30분 마다 약 3~4만개 사이의 데이터가 insert 되는 테이블이 있습니다
약 1.5기가의 데이터가 쌓여있으며 인덱스 파일인 YMI파일은 3.4기가 정도의 크기입니다.
데이터를 알아보기 위한 테이블로 count()와 count ( distinct )) 를 많이 쓰는데요.
기가를 넘어서다보니 쿼리 출력값이 무척 느립니다.


테이블의 모양은 다음과 같습니다.

CREATE TABLE `dev_9999` (
  `uid` varchar(8) default NULL,
  `prepage` int(11) default NULL,
  `curpage` int(11) default NULL,
  `aid` int(11) default NULL,
  `bid` int(11) default NULL,
  `cid` int(11) default NULL,
  `did` int(11) default NULL,
  `eid` int(11) default NULL,
  `YMD` varchar(8) default NULL,
  `TM` varchar(2) default NULL,
  KEY `IDX_USR_V` (`uid`),
  KEY `IDX_USR_C` (`aid`),
  KEY `IDX_USR_S` (`bid`),
  KEY `IDX_USR_A` (`cid`),
  KEY `IDX_USR_PRE` (`prepage`),
  KEY `IDX_USR_CUR` (`curpage`),
  KEY `IDX_USR_RPTDAY` (`YMD`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

총 row수는 33113941개 입니다.

select count(distinct uid) from dev_9999 으로 쿼리를 날렸을 때

1230598 라는 결과가 나오는데 (12 min 51.34 sec) 이 걸립니다.

단순한 쿼리라 실행 계획은
+---+------------+--------------+------+---------------+------------+---------+-------+--------+-------------+
| id | select_type | table              | type  | possible_keys | key            | key_len | ref      | rows     | Extra          |
+---+------------+--------------+------+---------------+------------+---------+-------+--------+-------------+
|  1 | SIMPLE      | user_pv_11425 | index | NULL            | IDX_USR_V | 11          | NULL | 33113941 | Using index |
+---+------------+--------------+------+---------------+------------+---------+-------+--------+-------------+
와 같은데.



쿼리가 너무 느려서 속도 증가를 꾀하고 싶습니다.
어떤 방법이 있을까요?



서버는
제온 2.4 듀얼 512KB 캐시
6기가 메모리 입니다



status global variable
결과는 아래와 같습니다


+---------------------------------+----------------------------------------------------+
| Variable_name                   | Value                                              |
+---------------------------------+----------------------------------------------------+
| auto_increment_increment        | 1                                                  |
| auto_increment_offset           | 1                                                  |
| automatic_sp_privileges         | ON                                                 |
| back_log                        | 50                                                 |
| basedir                         | /devel/mysql-5.0.45-linux-i686/                      |
| binlog_cache_size               | 32768                                              |
| bulk_insert_buffer_size         | 8388608                                            |
| character_set_client            | latin1                                             |
| character_set_connection        | latin1                                             |
| character_set_database          | latin1                                             |
| character_set_filesystem        | binary                                             |
| character_set_results           | latin1                                             |
| character_set_server            | latin1                                             |
| character_set_system            | utf8                                               |
| character_sets_dir              | /devel/mysql-5.0.45-linux-i686/share/mysql/charsets/ |
| collation_connection            | latin1_swedish_ci                                  |
| collation_database              | latin1_swedish_ci                                  |
| collation_server                | latin1_swedish_ci                                  |
| completion_type                 | 0                                                  |
| concurrent_insert               | 1                                                  |
| connect_timeout                 | 5                                                  |
| datadir                         | /usr/local/mysql/data/                             |
| date_format                     | %Y-%m-%d                                           |
| datetime_format                 | %Y-%m-%d %H:%i:%s                                  |
| default_week_format             | 0                                                  |
| delay_key_write                 | ON                                                 |
| delayed_insert_limit            | 100                                                |
| delayed_insert_timeout          | 300                                                |
| delayed_queue_size              | 1000                                               |
| div_precision_increment         | 4                                                  |
| engine_condition_pushdown       | OFF                                                |
| expire_logs_days                | 0                                                  |
| flush                           | OFF                                                |
| flush_time                      | 0                                                  |
| ft_boolean_syntax               | + -><()~*:""&|                                     |
| ft_max_word_len                 | 84                                                 |
| ft_min_word_len                 | 4                                                  |
| ft_query_expansion_limit        | 20                                                 |
| ft_stopword_file                | (built-in)                                         |
| group_concat_max_len            | 1024                                               |
| have_archive                    | YES                                                |
| have_bdb                        | NO                                                 |
| have_blackhole_engine           | YES                                                |
| have_compress                   | YES                                                |
| have_crypt                      | YES                                                |
| have_csv                        | YES                                                |
| have_dynamic_loading            | NO                                                 |
| have_example_engine             | YES                                                |
| have_federated_engine           | YES                                                |
| have_geometry                   | YES                                                |
| have_innodb                     | YES                                                |
| have_isam                       | NO                                                 |
| have_merge_engine               | YES                                                |
| have_ndbcluster                 | DISABLED                                           |
| have_openssl                    | DISABLED                                           |
| have_ssl                        | DISABLED                                           |
| have_query_cache                | YES                                                |
| have_raid                       | NO                                                 |
| have_rtree_keys                 | YES                                                |
| have_symlink                    | YES                                                |
| hostname                        | newgather                                          |
| init_connect                    |                                                    |
| init_file                       |                                                    |
| init_slave                      |                                                    |
| innodb_additional_mem_pool_size | 1048576                                            |
| innodb_autoextend_increment     | 8                                                  |
| innodb_buffer_pool_awe_mem_mb   | 0                                                  |
| innodb_buffer_pool_size         | 8388608                                            |
| innodb_checksums                | ON                                                 |
| innodb_commit_concurrency       | 0                                                  |
| innodb_concurrency_tickets      | 500                                                |
| innodb_data_file_path           | ibdata1:10M:autoextend                             |
| innodb_data_home_dir            |                                                    |
| innodb_doublewrite              | ON                                                 |
| innodb_fast_shutdown            | 1                                                  |
| innodb_file_io_threads          | 4                                                  |
| innodb_file_per_table           | OFF                                                |
| innodb_flush_log_at_trx_commit  | 1                                                  |
| innodb_flush_method             |                                                    |
| innodb_force_recovery           | 0                                                  |
| innodb_lock_wait_timeout        | 50                                                 |
| innodb_locks_unsafe_for_binlog  | OFF                                                |
| innodb_log_arch_dir             |                                                    |
| innodb_log_archive              | OFF                                                |
| innodb_log_buffer_size          | 1048576                                            |
| innodb_log_file_size            | 5242880                                            |
| innodb_log_files_in_group       | 2                                                  |
| innodb_log_group_home_dir       | ./                                                 |
| innodb_max_dirty_pages_pct      | 90                                                 |
| innodb_max_purge_lag            | 0                                                  |
| innodb_mirrored_log_groups      | 1                                                  |
| innodb_open_files               | 300                                                |
| innodb_rollback_on_timeout      | OFF                                                |
| innodb_support_xa               | ON                                                 |
| innodb_sync_spin_loops          | 20                                                 |
| innodb_table_locks              | ON                                                 |
| innodb_thread_concurrency       | 8                                                  |
| innodb_thread_sleep_delay       | 10000                                              |
| interactive_timeout             | 28800                                              |
| join_buffer_size                | 131072                                             |
| key_buffer_size                 | 1073741824                                         |
| key_cache_age_threshold         | 300                                                |
| key_cache_block_size            | 1024                                               |
| key_cache_division_limit        | 100                                                |
| language                        | /devel/mysql-5.0.45-linux-i686/share/mysql/english/  |
| large_files_support             | ON                                                 |
| large_page_size                 | 0                                                  |
| large_pages                     | OFF                                                |
| lc_time_names                   | en_US                                              |
| license                         | GPL                                                |
| local_infile                    | ON                                                 |
| locked_in_memory                | OFF                                                |
| log                             | OFF                                                |
| log_bin                         | ON                                                 |
| log_bin_trust_function_creators | OFF                                                |
| log_error                       |                                                    |
| log_queries_not_using_indexes   | OFF                                                |
| log_slave_updates               | OFF                                                |
| log_slow_queries                | OFF                                                |
| log_warnings                    | 1                                                  |
| long_query_time                 | 10                                                 |
| low_priority_updates            | OFF                                                |
| lower_case_file_system          | OFF                                                |
| lower_case_table_names          | 0                                                  |
| max_allowed_packet              | 1047552                                            |
| max_binlog_cache_size           | 4294967295                                         |
| max_binlog_size                 | 1073741824                                         |
| max_connect_errors              | 10                                                 |
| max_connections                 | 100                                                |
| max_delayed_threads             | 20                                                 |
| max_error_count                 | 64                                                 |
| max_heap_table_size             | 1073741824                                         |
| max_insert_delayed_threads      | 20                                                 |
| max_join_size                   | 18446744073709551615                               |
| max_length_for_sort_data        | 1024                                               |
| max_prepared_stmt_count         | 16382                                              |
| max_relay_log_size              | 0                                                  |
| max_seeks_for_key               | 4294967295                                         |
| max_sort_length                 | 1024                                               |
| max_sp_recursion_depth          | 0                                                  |
| max_tmp_tables                  | 32                                                 |
| max_user_connections            | 0                                                  |
| max_write_lock_count            | 4294967295                                         |
| multi_range_count               | 256                                                |
| myisam_data_pointer_size        | 6                                                  |
| myisam_max_sort_file_size       | 2147483647                                         |
| myisam_recover_options          | OFF                                                |
| myisam_repair_threads           | 1                                                  |
| myisam_sort_buffer_size         | 268435456                                          |
| myisam_stats_method             | nulls_unequal                                      |
| ndb_autoincrement_prefetch_sz   | 32                                                 |
| ndb_force_send                  | ON                                                 |
| ndb_use_exact_count             | ON                                                 |
| ndb_use_transactions            | ON                                                 |
| ndb_cache_check_time            | 0                                                  |
| ndb_connectstring               |                                                    |
| net_buffer_length               | 16384                                              |
| net_read_timeout                | 30                                                 |
| net_retry_count                 | 10                                                 |
| net_write_timeout               | 60                                                 |
| new                             | OFF                                                |
| old_passwords                   | OFF                                                |
| open_files_limit                | 2158                                               |
| optimizer_prune_level           | 1                                                  |
| optimizer_search_depth          | 62                                                 |
| pid_file                        | /usr/local/mysql/data/newgather.pid                |
| port                            | 3306                                               |
| preload_buffer_size             | 32768                                              |
| profiling                       | OFF                                                |
| profiling_history_size          | 15                                                 |
| protocol_version                | 10                                                 |
| query_alloc_block_size          | 8192                                               |
| query_cache_limit               | 1048576                                            |
| query_cache_min_res_unit        | 4096                                               |
| query_cache_size                | 67108864                                           |
| query_cache_type                | ON                                                 |
| query_cache_wlock_invalidate    | OFF                                                |
| query_prealloc_size             | 8192                                               |
| range_alloc_block_size          | 2048                                               |
| read_buffer_size                | 67104768                                           |
| read_only                       | OFF                                                |
| read_rnd_buffer_size            | 67104768                                           |
| relay_log_purge                 | ON                                                 |
| relay_log_space_limit           | 0                                                  |
| rpl_recovery_rank               | 0                                                  |
| secure_auth                     | OFF                                                |
| secure_file_priv                |                                                    |
| server_id                       | 1                                                  |
| skip_external_locking           | ON                                                 |
| skip_networking                 | OFF                                                |
| skip_show_database              | OFF                                                |
| slave_compressed_protocol       | OFF                                                |
| slave_load_tmpdir               | /tmp/                                              |
| slave_net_timeout               | 3600                                               |
| slave_skip_errors               | OFF                                                |
| slave_transaction_retries       | 10                                                 |
| slow_launch_time                | 2                                                  |
| socket                          | /tmp/mysql.sock                                    |
| sort_buffer_size                | 67108856                                           |
| sql_big_selects                 | ON                                                 |
| sql_mode                        |                                                    |
| sql_notes                       | ON                                                 |
| sql_warnings                    | OFF                                                |
| ssl_ca                          |                                                    |
| ssl_capath                      |                                                    |
| ssl_cert                        |                                                    |
| ssl_cipher                      |                                                    |
| ssl_key                         |                                                    |
| storage_engine                  | MyISAM                                             |
| sync_binlog                     | 0                                                  |
| sync_frm                        | ON                                                 |
| system_time_zone                | KST                                                |
| table_cache                     | 1024                                               |
| table_lock_wait_timeout         | 50                                                 |
| table_type                      | MyISAM                                             |
| thread_cache_size               | 8                                                  |
| thread_stack                    | 126976                                             |
| time_format                     | %H:%i:%s                                           |
| time_zone                       | SYSTEM                                             |
| timed_mutexes                   | OFF                                                |
| tmp_table_size                  | 33554432                                           |
| tmpdir                          | /tmp/                                              |
| transaction_alloc_block_size    | 8192                                               |
| transaction_prealloc_size       | 4096                                               |
| tx_isolation                    | REPEATABLE-READ                                    |
| updatable_views_with_limit      | YES                                                |
| version                         | 5.0.45-log                                         |
| version_comment                 | MySQL Community Server (GPL)                       |
| version_compile_machine         | i686                                               |
| version_compile_os              | pc-linux-gnu                                       |
| wait_timeout                    | 28800                                              |
+---------------------------------+----------------------------------------------------+

이 글에 대한 댓글이 총 4건 있습니다.

깊이 생각해본건 아니지만 uid가 varchar(8)인 점을 감안했을 때,
이를 외부 테이블로 빼서 int fid로 바꾸고 해당 컬럼을 인덱싱한 후에 count(distinct fid)하면 빨라질 것 같습니다.

박현우(lqez)님이 2009-01-08 10:42에 작성한 댓글입니다.

안녕하세요


짧은 견해로 보기엔 문제가 보이지 않습니다. 쿼리도 index 스캔을 해서 데이터를 가져오긴하는데요

문제는 다른부분에서 발생할 요소가 있습니다. 또한, 말씀하신부분에 30분마다 대량의 데이터가 
갱신이 된다면 걸려있는 index에 많은 무리가 갈듯한데요


현재 테이블의 거의 모든 컬럼에 index가 걸려있습니다. 만약 해당 컬럼에 대해서 별다른 조회가 없다면 과감하게 index를 삭제하는것도 하나의 방법입니다. 

다른 방법으로는 30분 주기로 데이터가 쌓이고 대기할 경우 optimize를 실행하는것도 괜찮긴 하지만 이방법에는 optimize가 Table에 Rock를 걸기때문에 다음 insert 전까지 완료해야 된다는 전제 조건이 있습니다.

또한 데이터를 읽고 쓸때 top 명령어를 이용해서 cpu나 메모리 점율을 체크해보심을 추천드립니다. 갑자기 많은 양의 메모리를 쓰면서 처리가 느려질 가능성도 다분합니다.(이건 개인적인 견해입니다.)


마지막 방법으로는 별도의 서브 DB를 구축하여 (local에서 구현이 가능합니다.) Replication을 구축합니다. 이 Table은 검색 대상인 uid에만 index를 거시고 여기서 Select하는것도 하나의 방법이 됩니다. 
물런 table의 용량과 증가유을 감안하여 디스크 증설을 감안하셔야 할 듯 합니다.


그럼 이만 ^^;


좋은 하루 되세요

박성원(darkancia)님이 2009-01-08 11:54에 작성한 댓글입니다.

답변 감사합니다.

데이터 가공을 편하게 하기 위해 Mysql을 로우데이터를 입력하는 테이블로 사용했는데
데이터가 커지니까 생각지 못했던 문제가 발생을 하네요.

실제 테스트를 해보니
select count(distinct uid) from dev_9999의 결과 보다
select distinct uid from dev_9999 로 msql 라이브러리를 이용한 C프로그램에서
새는것이 훨신 빠릅니다.

적당히 섞어 쓰던지 파일기반으로 돌아가는 방법을 찾아보는게 좋을 것 같네요.;;

안중경(systemfile)님이 2009-01-09 19:23에 작성한 댓글입니다.
이 댓글은 2009-01-09 19:23에 마지막으로 수정되었습니다.

인서트 프로그램에서

카운팅하는 로직을 짜서 집계테이블에 트랜잭션으로 묶은후 넣으시면 될듯합니다~

(아마 innodb로 변경하셔야할듯 ㅜ.ㅜ)


mysql에 너무 많은 일을 시키면 곤란합니다 ㅋㅋ

아니시면 index 파일만 램디스크(또는 빠른디스크)에 두시고 카운팅하는것도 괜찮아 보입니다~



나그네님이 2009-01-10 19:51에 작성한 댓글입니다.
이 댓글은 2009-01-10 19:57에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
27967mysql과 mssql의 차이점에 관해서 문의 드립니다. [2]
박성원
2009-01-12
4859
27966공인자격증에 대해서 문의 드립니다.
박성원
2009-01-09
4105
27965Innodb 이노디비 live상태의 핫백업 가능한가요?
stone
2009-01-09
4794
27964단순 쿼리 속도가 너무 느립니다. [4]
안중경
2009-01-07
6129
27963mysql에서 table 'tablename' is marked as crashed and should be repaired
임시손님
2009-01-07
5019
27962Table lock과 MyISAM 에 관한 질문입니다. (re:query explan에 대한 문의) [1]
박성원
2009-01-07
5396
27961Mysql version upgrade 문의 드립니다. (__) [2]
김현수
2009-01-07
4919
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다