簡體   English   中英

改善案例何時表現?

[英]Improve Case When performance?

請參閱下面的SQL查詢:

   SELECT SUM(CASE WHEN status=0 AND type  IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_0',
           SUM(CASE WHEN status=0 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_0',
           SUM(CASE WHEN status=2 AND type IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_2',
           SUM(CASE WHEN status=2 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_2',
           SUM(CASE WHEN status=3 AND type IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_3',
           SUM(CASE WHEN status=3 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_3',
           SUM(CASE WHEN status=4 AND type IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_4',
           SUM(CASE WHEN status=4 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_4',
           SUM(CASE WHEN status=5 AND type IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_5',
           SUM(CASE WHEN status=5 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_5'
    FROM sales;

需要半秒鍾才能得到結果,我想進一步提高性能。 有什么建議可以做什么?

sales表是innodbstatus type是索引。 sales表中超過50,000行。

my.ini文件:

[wampmysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.36
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.36/data



#innodb_data_home_dir = C:\mysql\data/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = C:\mysql\data/
#innodb_log_arch_dir = C:\mysql\data/
#innodb_additional_mem_pool_size = 2M
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
innodb_buffer_pool_size = 500M

3GB Ram,英特爾雙核CPU。

在查詢上添加WHERE子句

SELECT  SUM(CASE WHEN status=0 AND type  IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_0',
        SUM(CASE WHEN status=0 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_0',
        SUM(CASE WHEN status=2 AND type IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_2',
        SUM(CASE WHEN status=2 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_2',
        SUM(CASE WHEN status=3 AND type IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_3',
        SUM(CASE WHEN status=3 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_3',
        SUM(CASE WHEN status=4 AND type IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_4',
        SUM(CASE WHEN status=4 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_4',
        SUM(CASE WHEN status=5 AND type IN (0, 5, 7) THEN 1 ELSE NULL END) AS 'a_5',
        SUM(CASE WHEN status=5 AND type IN (1, 6, 8) THEN 1 ELSE NULL END) AS 'b_5'
FROM    sales
WHERE   status IN (0,2,3,4,5) AND
        type IN (0,1,5,6,7,8)

您可以使用

SELECT COUNT(*) FROM sales AS 'a0' WHERE status=0 AND type  IN (0, 5, 7) 

其他7個查詢類似。 您可以將所有查詢合並為一個具有聯接的大型查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM