मैंने अब लगभग एक घंटे के लिए निम्नलिखित समस्या को हल करने की कोशिश की और अभी भी इसके साथ आगे नहीं मिला।
ठीक है, मेरे पास एक मेज है (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 |
+-----------+
ध्यान दें कि प्राथमिक कुंजी सेट करने का कोई बेहतर तरीका नहीं है क्योंकि आईडी कॉलम मेरे पास एकमात्र विशिष्ट पहचानकर्ता होगा। उपर्युक्त क्वेरी को चलाने में लगभग 0.6-1.6 सेकंड लगते हैं।
कौन सा सूचकांक चतुर होगा? मुझे लगा कि इंडेक्सिंग की तारीख मुझे "खराब" कार्डिनैलिटी देगी और इस तरह MySQL इसका उपयोग नहीं करेगी। http भी एक बुरा विकल्प है क्योंकि इसमें लगभग 20 विभिन्न संभावित मूल्य हैं।
मदद के लिये शुक्रिया!
अपडेट 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
स्तम्भ अशक्त होने के साथ यह करना पड़ सकता है । अगर मुझे समय मिल गया तो मैं कल जांच करूंगा।
http NOT NULL
) और सभी डेटा को कॉपी करके (निश्चित रूप से http NULL के साथ पंक्तियों को छोड़कर) परीक्षण कर सकते हैं ।