bu sql ilk çalıştırdığınızda çalışmaz: Ben çeşitli yöntemler denedik SQL_NO_CACHE tekrar çalıştırın ve SQL_NO_CACHE arttıkça, etkili olması için görünmüyor, 39 saniye gerekmektedir,
mysql> select count(*) from `deal_expired` where `site`=8&&`area`=122 &&
endtime<1310444996056;
+----------+
| count(*) |
+----------+
| 497 |
+----------+
1 row in set (39.55 sec)
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=8&&`area`=
122 && endtime<1310444996056;
+----------+
| count(*) |
+----------+
| 497 |
+----------+
1 row in set (0.16 sec)
,
here
ve hatta mysql server veya değiştirmek tablosu adını yeniden, ama yine de 39 saniye başka SQL ve SQL_NO_CACHE üzerinde ilk çalıştırmada bir artış yerini
bu SQL çalıştırmak izin veremem, sorun aynıdır:
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=25&&`area`=
134 && endtime<1310483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (2.17 sec)
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=25&&`area`=
134 && endtime<1310483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (0.01 sec)
Sebep nedir? Aynı SQL çalışma zamanını nasıl alabilirim? RESET QUERY CACHE
FLUSH QUERY CACHE
FLUSH TABLES
SET SESSION query_cache_type=off
MySQL devlet önbellek kapatıldı
çalışmıyor:
Ben 39 saniye
BTWgerçekleştirmek için bu SQL optimize etmek için bir yol bulmak istiyorum
mysql> SHOW STATUS LIKE "Qcache%";
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
8 rows in set (0.04 sec)
mysql> select count(*) from `deal_expired` where `site`=25&&`area`=134 && endtime<1310
483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (0.01 sec)
mysql> SHOW STATUS LIKE "Qcache%";
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
8 rows in set (0.00 sec)
bu SQL'i açıklar, kullanılmış site + bitiş zamanı bileşik dizini (site_endtime olarak adlandırılır):
mysql> explain select count(*) from `deal_expired` where `site`=8&&`area`=122 && endti
me<1310444996056;
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
| table | type | possible_keys | key | key_len | ref
| rows | Extra |
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
| deal_expired | ref | name,url,endtime,site_endtime | site_endtime | 4 | const
| 353 | Using where |
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
1 row in set (0.00 sec)
Bu sorgu için ** kompozit ** dizini kullanıyor musunuz? – Karolis
@Karolis bir site + bitiş saati (site_endtime' adı verilen) bileşik dizini var – Koerr
Belirli bir veritabanı hakkında hiçbir şey bilmiyorum, ama başka bir bileşik endeksi (site + alan + bitiş) oluşturmak iyi bir fikir olurdu gibi görünüyor . MySql daha az satır okuyacaktır, bu yüzden daha hızlı hale gelmelidir. – Karolis