ฉันพยายามที่จะแก้ปัญหาต่อไปนี้เป็นเวลาประมาณหนึ่งชั่วโมงในขณะนี้และยังไม่ได้รับเพิ่มเติมด้วย
โอเคฉันมีโต๊ะ (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 จะไม่ใช้มัน httpเป็นตัวเลือกที่ไม่ดีเนื่องจากมีค่าที่เป็นไปได้ที่แตกต่างกันประมาณ 20 ค่าเท่านั้น
ขอบคุณสำหรับความช่วยเหลือของคุณ!
อัปเดต 1ฉันได้เพิ่มดัชนีใน(http, วันที่)ตามที่แนะนำใน ypercube:
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
คอลัมน์ที่ไม่มีค่า ฉันจะตรวจสอบพรุ่งนี้ถ้าฉันหาเวลา
http NOT NULL
) และคัดลอกข้อมูลทั้งหมดไปยังมัน (ยกเว้นแถวที่มี http NULL แน่นอน)