2017-08-01 1 views
0

In Datatables verwende ich zwei Abfrage eins, um Datensätze in diesem bestimmten Datumsbereich mit serverseitiger Seitennumerierung und eine andere, um die Gesamtzahl der Datensätze in diesem bestimmten Datumsbereich abzurufen. Ich benutze Postgresql Datenbank.Datatables beschleunigen die Inhaltsanzeige

select * from daily_txns where created_date <='2017-08-01' and created_date>='2017-07-01' and mid='0446721M0008690' order by created_date desc limit 10; 

select count(mid) from daily_txns where created_date <='2017-08-01' and created_date>='2017-07-01' and mid='0446721M0008690'; 

Ist dies der richtige Weg oder gibt es den besten Ansatz für das gleiche? Wenn die erste Abfrage 20 Sekunden dauert, dauert die zweite Abfrage 40 Sekunden und die Gesamtzeit für die Anzeige des Ergebnisses beträgt mehr als 60 Sekunden. Wie man dieses Problem löst.

+0

in der zweiten Abfrage, die Sie verwenden können, 'count (1)' –

+0

Wie lange dauert es, jede Abfrage in der Datenbank ausgeführt werden, ohne etwas in Datentabellen zu laden? – bhttoan

+0

In der ersten Abfrage können Sie zuerst 10 Datensätze erhalten und dann können Sie 'order by' Bedingung geben –

Antwort

0

Wenn Sie Postgres verwenden, können Sie diese verwenden, um alles zu einer einzigen Abfrage

select *, count(*) OVER() AS full_count from daily_txns where created_date <='2017-08-01' and created_date>='2017-07-01' and mid='0446721M0008690' order by created_date desc limit 10; 

die „count (*) OVER() AS full_count“ zu reduzieren ‚ignore‘ die Grenzen überschreiten geben Ihnen die volle Anzahl der möglichen Elemente

+0

Können Sie bitte erklären, wie es Ausführungszeit reduzieren kann? –

+0

Dies nimmt mich viel mehr Zeit als beide separat ausgeführt –

+0

Wie können Datensätze insgesamt auf daily_txns-Tabelle? Haben Sie einen Index auf dem Tisch? Welche DB verwendest du? – Brugolo

0

Lösung hängt von Ihrer Tabelle Indizes und diese Antwort nur, wenn Indizes korrigieren und Sie Lösungen wie count (*) hilft Ihnen nicht.

Aber manchmal können Sie versuchen, Flag SQL_CALC_FOUND_ROWS für Ihre Abfrage zu verwenden, aber ich empfehle, this Frage und Antwort zu lesen, bevor Sie es verwenden.

Lösung:

select SQL_CALC_FOUND_ROWS * from daily_txns where created_date <='2017-08-01' and created_date>='2017-07-01' and mid='0446721M0008690' order by created_date desc limit 10; 

Und Abfrage für Gesamt Datensätze für Ihre Abfrage

SELECT FOUND_ROWS() as cnt 
0

Sie benötigen einen Index für die Spalten Mitte und created_date auf dem Tisch daily_txns hinzuzufügen. Ich nehme auch an, dass mid restriktiver ist als created_date, also empfehle ich, es zuerst in der Abfrage zu verwenden, damit die Suche schneller reduziert wird.

select * from daily_txns where mid='0446721M0008690' created_date <='2017-08-01' and created_date>='2017-07-01' order by created_date desc limit 10; 

select count(mid) from daily_txns where mid='0446721M0008690' and created_date <='2017-08-01' and created_date>='2017-07-01';