Yaklaşık bir saat boyunca aşağıdaki sorunu çözmeye çalıştım ve hala daha fazla alamadım.
Tamam, bir masam var (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 | |
+---------+-------------+------+-----+-------------------+----------------+
Lütfen dizinlere aldırmayın, bir çözüm bulmaya çalışıyorum. Şimdi, işte sorgum.
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;
tablo gelen web istekleri hakkında bilgi depolamak böylece oldukça büyük bir veritabanı.
+-----------+
| count(id) |
+-----------+
| 782412 |
+-----------+
kimlik sütunu sahip olduğum tek benzersiz tanımlayıcı olacağından birincil anahtarı ayarlamanın daha iyi bir yolu olmadığını unutmayın . Yukarıda belirtilen sorgunun çalışması yaklaşık 0.6-1.6 saniye sürer.
Hangi indeks akıllı olur? İndeksleme tarihinin bana "kötü" kardinalite vereceğini düşündüm ve böylece MySQL bunu kullanmayacak.http sadece kötü bir seçimdir, çünkü sadece yaklaşık 20 farklı olası değer vardır.
Yardımın için teşekkürler!
Güncelleme 1 Ypercube'ün önerdiği gibi (http, tarih) üzerine bir dizin ekledim:
mysql> CREATE INDEX httpDate ON reqs (http, date);
ve sorgusunu kullandı, ama aynı derecede kötü performans gösterdi. Eklenen dizin:
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| 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 | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
ve EXPLAIN
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
| 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 sunucu sürümü:
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
sütun null edilebilir olması ile ilgili olabilir . Zaman bulursam yarın araştıracağım.
http NOT NULL
) ve tüm verileri bu tabloya kopyalayarak test edebilirsiniz (elbette http NULL içeren satırlar hariç.)