2017-01-25 15 views
1

のために、私は自分のデータベース内のテーブルを持っていることによって使用方法:とグループのMySQL

CREATE TABLE `yapial` (
    `user_id` int(11) NOT NULL, 
    `username` varchar(255) DEFAULT NULL, 
    `first_name` varchar(50) DEFAULT NULL, 
    `last_name` varchar(50) DEFAULT NULL, 
    `gender` varchar(10) DEFAULT NULL, 
    `password` varchar(50) DEFAULT NULL, 
    `status` tinyint(10) DEFAULT NULL, 
    `date` datetime NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

状態日付列のインデックス。私はSQLコードを実行する:

select status, count(*) from user_details group by status 

と0.34msの成功を実行します。しかし、日付の制限=>

select date, status, count(*) from user_details 
where date between '2017-01-25 18:13:50' and '2017-01-29 18:13:50' 
group by status 

6.52秒の実行を追加したいと思います。時間制限が高すぎます。私は時間を短縮したい。これをどのように改善するべきですか?

答えて

0

0.34msかかるクエリは、おそらくMySQL query cacheからその結果を取得しています。クエリがそれほど高速ではありそうもありません。

私が思う最良の最適化は、2列のインデックスがある場合です。

alter table user_details 
    add key (status, date), 
    add key (date, status); 

最初のインデックスが使用されている場合は、インデックス・スキャンを行いますが、それは一時テーブルを避けることができます::2つの可能性がある。

explain select sql_no_cache date, status, count(*) 
    from user_details use index (status) 
    where date between '2017-01-25 18:13:50' and '2017-01-29 18:13:50' 
    group by status\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: user_details 
    partitions: NULL 
     type: index 
possible_keys: date,status 
      key: status 
     key_len: 7 
      ref: NULL 
     rows: 3 
    filtered: 33.33 
     Extra: Using where; Using index 

2番目のインデックスが使用されている場合、それはなります範囲を参照するために索引を使用し、行を日付範囲と照合しますが、一時表が作成されます。

[email protected] [test] > explain select sql_no_cache date, status, count(*) 
    from user_details use index (date) 
    where date between '2017-01-25 18:13:50' and '2017-01-29 18:13:50' 
    group by status\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: user_details 
    partitions: NULL 
     type: range 
possible_keys: date,status 
      key: date 
     key_len: 5 
      ref: NULL 
     rows: 1 
    filtered: 100.00 
     Extra: Using where; Using index; Using temporary; Using filesort 

どのインデックスが最適かは、条件に一致する行の数によって異なります。

+0

確かにこのメソッドはよりパフォーマンスです。私は試して、成功は2.5秒実行しています。 – user6483202