Оптимизация встроенного Запроса Select в MySQL

Я добился этого с помощью следующего кода в app.component.ts:

import { Component, OnInit, Inject, Injectable } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {

    constructor(@Inject(DOCUMENT) private document: any) { }

    ngOnInit() {
        this.domain = this.document.location.hostname;
        console.log(this.domain);
    }
}

Это должно напечатать доменное имя в вашей консоли.

5
задан Crazy Serb 30 May 2009 в 14:08
поделиться

3 ответа

Такие типы подзапросов IN немного медленны в MySQL. Я бы перефразировал это так:

SELECT COUNT(1) AS signup_count, SUM(amount) AS signup_amount
FROM   payments p
WHERE  tm_completed BETWEEN '2009-05-01' AND '2009-05-30'
AND    completed > 0
AND    NOT EXISTS (
           SELECT member_id
           FROM   payments
           WHERE  member_id = p.member_id
           AND    completed = 1
           AND    tm_completed < '2009-05-01');

Проверка « tm_completed IS NOT NULL » не нужна, поскольку это подразумевается вашим условием BETWEEN .

Также убедитесь, что у вас есть индекс по:

(tm_completed, completed)
7
ответ дан 18 December 2019 в 10:48
поделиться

Избегайте использования IN с подзапросом; MySQL плохо их оптимизирует (хотя в 5.4 и 6 есть ожидающие оптимизации. 0 (см. здесь ). Переписав это как соединение, вы, вероятно, повысите производительность:

SELECT count(payment_id) as signup_count, sum(amount) as signup_amount
FROM payments p
LEFT JOIN (SELECT p2.member_id
          FROM payments p2
          WHERE p2.completed=1
          AND p2.tm_completed < '2009-05-01'
          AND p2.tm_completed IS NOT NULL
          GROUP BY p2.member_id) foo
ON p.member_id = foo.member_id AND foo.member_id IS NULL
WHERE tm_completed BETWEEN '2009-05-01' AND '2009-05-30'
AND completed > 0
AND tm_completed IS NOT NULL

Во-вторых, мне нужно увидеть схему вашей таблицы; вы используете индексы?

2
ответ дан 18 December 2019 в 10:48
поделиться

Мне было интересно собрать это решение, которое не требует подзапроса:

SELECT count(p1.payment_id) as signup_count, 
       sum(p1.amount)       as signup_amount  

  FROM payments p1
       LEFT JOIN payments p2 
       ON p1.member_id = p2.member_id
   AND p2.completed = 1
   AND p2.tm_completed < date '2009-05-01'

 WHERE p1.completed > 0
   AND p1.tm_completed between date '2009-05-01' and date '2009-05-30'
   AND p2.member_id IS NULL;
7
ответ дан 18 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: