ich eine Abfrage haben Daten zwischen der aktuellen Zeit und INTERVAL 15 Minutenmysql query in großen Tabellen verbessern
Tabelle Anrufe 39.790.720 Elemente zu erhalten;
SELECT src,unique,dstchannel,chan,calldate
FROM calls
WHERE calldate BETWEEN (NOW() - INTERVAL 15 MINUTE) AND NOW()
AND (dstchannel LIKE '%TEXT1/%'
OR dstchannel LIKE '%TEXT2%'
OR dstchannel LIKE '%TEXT3%'
OR dstchannel REGEXP '^SIP/[[:digit:]]{10}-'
OR dstchannel LIKE '%TEXT4%'
OR dstchannel LIKE '%TEXT5%'
OR dstchannel LIKE '%TEXT6%'
OR dstchannel LIKE '%TEXT7%'
)
AND lastdata NOT LIKE '%TEXT8%'
LIMIT 39780720,39790720
Query 1 row in set (1 min 7.38 sec)
+-------------+--------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------------------+-------+
| calldate | datetime | NO | | 0000-00-00 00:00:00 | |
| colum1 | varchar(80) | NO | | | |
| colum11 | varchar(80) | NO | | | |
| src | varchar(80) | NO | | | |
| colum12 | varchar(80) | NO | | | |
| chan | varchar(80) | NO | | | |
| dstchannel | varchar(80) | NO | | | |
| colum2 | varchar(80) | NO | | | |
| colum3 | varchar(80) | NO | | | |
| colum4 | int(11) | NO | | 0 | |
| colum5 | int(11) | NO | | 0 | |
| colum6 | varchar(45) | NO | | | |
| colum7 | int(11) | NO | | 0 | |
| colum8 | varchar(20) | NO | | | |
| colum9 | varchar(32) | NO | | | |
| colum10 | varchar(255) | NO | | | |
+-------------+--------------+------+-----+---------------------+-------+
wie Abfrage verbessern?
UPDATE
+----+-------------+-------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+----------+-------------+
| 1 | SIMPLE | calls | ALL | NULL | NULL | NULL | NULL | 39791545 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+----------+-------------+
Das ist eine sehr allgemeine Frage, und ich würde Ihnen raten, 1) Ausführen EXPLAIN auf diese Abfrage und fügen Sie die Ergebnisse zu Ihrer Frage und 2) geben Sie Informationen über Indizes auf dieser Tabelle, die möglicherweise + die Tabelle existieren DDL. Abschließend noch ein Wort zur Hardware, auf der diese Abfrage ausgeführt wird. Vielleicht ist Ihr Server in der Praxis nur zu klein dimensioniert oder hat langsame Festplatten, zwei Faktoren, die für die Datenbankarbeit absolut tödlich sind. – fvu
Meiner Erfahrung nach kann der Wechsel zu einem INNODB-Tabellentyp helfen, wenn dies nicht bereits der Fall ist. Außerdem sollte "calldate" wahrscheinlich einen nicht eindeutigen Index haben, wie auch 'dstchannel'. Die Spalten, die Sie in' WHERE'-Klauseln verwenden. Ähm ... Ich verstehe diese LIMIT-Klausel allerdings nicht. –
% TEXT1% ist Referenz für die Kombination Variable in meinem Skript, aber hier nicht schreiben ... im meine Frage aktualisieren – pedroooo