تحسين الاستعلام للعثور على أحدث الإدخالات

0

لدي قاعدة بيانات أسعار العملات وأريد تحديد أحدث الأسعار فقط من خلال وجود طابع زمني يحدد الحداثة. (تحديد أحدث واحد لكل معدل ، وليس على الإطلاق لأنه قد يكون له طوابع زمنية مختلفة)

يقوم الاستعلام التالي بما أريد ، ولكنه بطيء للغاية (> 3 ثوانٍ)

SELECT  cR.currencyCode, cR.rate, cR.timestamp FROM currentRates cR
JOIN ( SELECT MAX(timestamp) as max, currencyCode 
       FROM currentRates 
       GROUP BY currencyCode) cR_mt 
ON (cR.timestamp = cR_mt.max AND cR.currencyCode = cR_mt.currencyCode);

مخطط الجدول كما يلي:

CREATE TABLE `currentRates` (
  `ID` int(11) NOT NULL,
  `rate` float DEFAULT NULL,
  `currencyCode` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `timestamp` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

مع وجود حاليًا ~ 150 ألف إدخال.


هل يمكنك مساعدتي بمعرفتك لتحسين وقت الاستعلام. لقد أجريت بالفعل مؤشرًا على المعدل ورمز العملة وانخفضت إلى 3 ثوانٍ (قبل أن تستغرق 10 ثوانٍ تقريبًا)

شكرا جزيلا لمساعدتكم!

L1am0

2 الاجابة

3
افضل جواب

أنت تجمع حسب currencyCode وحساب الحد الأقصى timestamp ، لذلك يجب أن يكون الفهرس الخاص بك currencyCode, timestamp بهذا الترتيب.

CREATE INDEX IDX_currentRates_CurrencyCode_Timestamp ON currentRates (currencyCode, timestamp)
:مؤلف
0

أقترح كتابة الاستعلام على النحو التالي:

SELECT cR.currencyCode, cR.rate, cR.timestamp
FROM currentRates cR
WHERE cR.timestamp = (SELECT MAX(cr2.timestamp)
                      FROM currentRates cR2
                      WHERE cR2.currencyCode = cR.currencyCode
                     );

ثم تريد الفهرس currentRates(currencyCode, timestamp desc) .

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام