2017-01-25 9 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.52s를 성공적으로 실행합니다. 제한 시간이 너무 깁니다. 나는 달리기 시간을 줄이고 싶다. 어떻게 개선해야합니까?

답변

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 

을 인덱스를 사용하여 범위 조회를 수행하고 기간을 기준으로 행을 일치 시키지만 임시 테이블이 생성됩니다.

[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