我的MySQL查詢有大量數據訪問時出現問題,當查詢使用連接進行優化時,它會在122秒內爲一週數據提供輸出。然後對於一個月的數據,該過程需要526秒。 我想優化這個查詢每年更少的處理時間或者是否有任何方法來優化MySQL設置?用於JOIN大型表的MySQL查詢優化
表細節。 我指的是兩個表,其中包括mdiaries和tv_diaries,在這兩個表中我都有索引相關列,在mdiaries表中tv_diaries中有2661331行和27074645行。
mdiaries表:
INDEX area (area),
INDEX date (date),
INDEX district (district),
INDEX gaDivision (gaDivision),
INDEX member_id (member_id),
INDEX tv_channel_id (tv_channel_id),
tv_diaries。
INDEX area (area),
INDEX date (date),
INDEX district (district),
INDEX member_id (member_id),
INDEX timeslot_id (timeslot_id),
INDEX tv_channel_id (tv_channel_id),
這是我的查詢,需要122秒才能執行。
$sql = "SELECT COUNT(TvDiary.id) AS m_count,TvDiary.date,TvDiary.timeslot_id,TvDiary.tv_channel_id,TvDiary.district,TvDiary.area
FROM `mdiaries` AS Mdiary INNER JOIN `tv_diaries` AS TvDiary ON Mdiary.member_id = TvDiary.member_id
WHERE Mdiary.date >= '2014-01-01' AND Mdiary.date <= '2014-01-07'
AND TvDiary.date >= '2014-01-01' AND TvDiary.date <= '2014-01-07'
GROUP BY TvDiary.date,
TvDiary.timeslot_id,
TvDiary.tv_channel_id,
TvDiary.district,
TvDiary.area";
這是my.cnf文件。
[mysqld]
## General
datadir = /var/lib/mysql
tmpdir = /var/lib/mysqltmp
socket = /var/lib/mysql/mysql.sock
skip-name-resolve
sql-mode = NO_ENGINE_SUBSTITUTION
#event-scheduler = 1
## Networking
back-log = 100
#max-connections = 200
max-connect-errors = 10000
max-allowed-packet = 32M
interactive-timeout = 3600
wait-timeout = 600
### Storage Engines
#default-storage-engine = InnoDB
innodb = FORCE
## MyISAM
key-buffer-size = 64M
myisam-sort-buffer-size = 128M
## InnoDB
innodb-buffer-pool-size = 16G
innodb_buffer_pool_instances = 16
#innodb-log-file-size = 100M
#innodb-log-buffer-size = 8M
#innodb-file-per-table = 1
#innodb-open-files = 300
## Replication
server-id = 1
#log-bin = /var/log/mysql/bin-log
#relay-log = /var/log/mysql/relay-log
relay-log-space-limit = 16G
expire-logs-days = 7
#read-only = 1
#sync-binlog = 1
#log-slave-updates = 1
#binlog-format = STATEMENT
#auto-increment-offset = 1
#auto-increment-increment = 2
## Logging
log-output = FILE
slow-query-log = 1
slow-query-log-file = /var/log/mysql/slow-log
#log-slow-slave-statements
long-query-time = 2
##
query_cache_size = 512M
query_cache_type = 1
query_cache_limit = 2M
join_buffer_size = 512M
thread_cache_size = 128
[mysqld_safe]
log-error = /var/log/mysqld.log
open-files-limit = 65535
[mysql]
no-auto-rehash
只需使用左連接代替內部連接,因爲您會看到性能 –
內部連接通常比左側連接快,所以通過這種方式它已經正確寫入。我想知道如果你真的需要採取所有的結果,如果一個極限會有所幫助 – Aleeeeee
@SatenderK我已經測試了左加入,但它比內加入更好,比左加入 –