나는 지금 약 1 시간 동안 다음 문제를 해결하려고했지만 여전히 더 이상 얻지 못했습니다.
좋아, 나는 테이블 (MyISAM)을 가지고있다 :
+---------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| http | smallint(3) | YES | MUL | 200 | |
| elapsed | float(6,3) | NO | | NULL | |
| cached | tinyint(1) | YES | | NULL | |
| ip | int(11) | NO | | NULL | |
| date | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+---------+-------------+------+-----+-------------------+----------------+
색인을 신경 쓰지 마십시오. 솔루션을 찾으려고 노력하고 있습니다. 자, 여기 내 질문이 있습니다.
SELECT http,
COUNT( http ) AS count
FROM reqs
WHERE DATE(date) >= cast(date_sub(date(NOW()),interval 24 hour) as datetime)
GROUP BY http
ORDER BY count;
테이블은 들어오는 웹 요청에 대한 정보를 저장하므로 다소 큰 데이터베이스입니다.
+-----------+
| count(id) |
+-----------+
| 782412 |
+-----------+
id 열이 내가 가진 유일한 식별자 이기 때문에 기본 키를 설정하는 더 좋은 방법은 없습니다 . 위에서 언급 한 쿼리를 실행하는 데 약 0.6-1.6 초가 걸립니다.
어느 인덱스가 영리할까요? 색인 날짜 가 "나쁜"카디널리티를 제공하므로 MySQL이 사용하지 않을 것이라고 생각했습니다. 가능한 값이 약 20 가지 밖에 없으므로 http 도 좋지 않습니다.
도와 주셔서 감사합니다!
업데이트 1 ypercube가 제안한대로 (http, date) 에 색인을 추가했습니다 .
mysql> CREATE INDEX httpDate ON reqs (http, date);
그의 쿼리를 사용했지만 똑같이 나빴습니다. 추가 된 색인 :
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| reqs | 0 | PRIMARY | 1 | id | A | 798869 | NULL | NULL | | BTREE | |
| reqs | 1 | httpDate | 1 | http | A | 19 | NULL | NULL | YES | BTREE | |
| reqs | 1 | httpDate | 2 | date | A | 99858 | NULL | NULL | | BTREE | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
그리고 설명
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
| 1 | PRIMARY | r | range | NULL | httpDate | 3 | NULL | 20 | Using index for group-by; Using temporary; Using filesort |
| 2 | DEPENDENT SUBQUERY | ri | ref | httpDate | httpDate | 3 | func | 41768 | Using where; Using index |
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
MySQL 서버 버전 :
mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+---------------------+
| Variable_name | Value |
+-------------------------+---------------------+
| protocol_version | 10 |
| version | 5.1.73 |
| version_comment | Source distribution |
| version_compile_machine | x86_64 |
| version_compile_os | redhat-linux-gnu |
+-------------------------+---------------------+
5 rows in set (0.00 sec)
http
열이 Null을 허용 하는 것과 관련이있을 수도 있습니다 . 시간이 있으면 내일 조사 할게요
http NOT NULL
) 모든 데이터를 복사하여 (물론 http NULL을 갖는 행 제외) 테스트 할 수 있습니다 .