mysql select ข้อมูลช้ามากครับ

กระทู้คำถาม
ข้อมูลเบื้องต้นครับ

select count(*) from events ใช้เวลา 16.06 sec
ผลลัพท์ 18,629,084 rows

select count(*) from events where billing_period=201203 ใช้เวลา 0.69 sec
ผลลัพท์ 254,150 rows

ผมบังคับใช้ index ตรงๆ เลย จริงๆ column นี้ create index อยู่แล้ว
select * from events use index(billing_period) where billing_period=201203 ใช้เวลา 945.62 sec หรือ 15 นาที ได้แค่ 92,000 rows ดังนั้น ถ้ารอก็คงประมาณ 30 นาที

คำถามทำไม 2 แสน กว่าๆ ถึงใช้เวลานานขนาดนั้น ทั้งๆ ที่ยังไม่ได้ join อะไรกันเลยครับ ผมจะปรับอะไรได้บ้างครับ

[mysql@mw-db02 ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_db03-lv_root
                      1.8T  456G  1.3T  27% /
tmpfs                 4.0G     0  4.0G   0% /dev/shm
/dev/sda1             194M   40M  145M  22% /boot
[mysql@mw-db02 ~]$ top

top - 11:37:17 up 1069 days,  9:40,  2 users,  load average: 0.28, 0.29, 0.27
Tasks: 116 total,   1 running, 115 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.6%us,  0.2%sy,  0.0%ni, 92.7%id,  2.5%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8193552k total,  8102228k used,    91324k free,   132652k buffers
Swap: 10305528k total,   404192k used,  9901336k free,  4811688k cached

my.cnf
[client]

#
# These options apply to all client applications
#

#
# Port and the socket
#
port = 3306
#
socket = /tmp/mysqld.sock
#
#password = my_password

#
#----------------------------------------------------------------
#

[safe_mysqld]

#
# Log file
#
err-log = /database/logs/mysql.err

#
#----------------------------------------------------------------
#

[mysqld]
skip_name_resolve

#
# Server ID must be unique to allow for replication
# Our servers are named: 1 - master -or- 2 - slave
# then the server number so mw-db02 (master) would
# be 1002, while slave mw-db03 would be 2003
#
server-id = 1002
auto-increment-increment = 4
auto-increment-offset = 2
#innodb_flush_log_at_trx_commit = 1
innodb_flush_log_at_trx_commit = 2
#sync_binlog = 1
sync_binlog = 0
socket = /tmp/mysqld.sock
max-connections = 300
max-allowed-packet=8M
basedir = /database/mysql
datadir = /database/data
tmpdir = /database/tmp
log-error = /database/logs/mysqld.err
pid-file = /var/run/mysqld/mysqld.pid
#log-bin=mysqld-bin
#binlog-format = row
slave_exec_mode=IDEMPOTENT

# The number of days to keep binary logs before they are automatically purged
expire_logs_days=30
relay-log=mysqld-relay-bin
#
skip-slave-start
#read-only
#
innodb-data-home-dir = /database/data
innodb-data-file-path = ibdata1:10M:autoextend
innodb-file-per-table
innodb-log-file-size = 128M # 4GB RAM

# Buffer pool size
innodb-buffer-pool-size = 2G # 4GB RAM
innodb-log-group-home-dir = /database/logs/innodb

# Character set and collation
character-set-server=utf8

#----------------------------------------------------------------
open_files_limit=4000
table_definition_cache=3000
table_open_cache=3000
query_cache_size=102400
log-queries-not-using-indexes=1
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่