2016-07-31 4 views
0

데이터베이스에서 최신 데이터를 가져 오려면 다음 SQL 쿼리를 사용하고 있습니다.최신 데이터 가져 오기 - SQL 쿼리 최적화

CREATE TABLE IF NOT EXISTS `discord` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_user` int(11) NOT NULL, 
    `id_channel` varchar(50) NOT NULL, 
    `id_game` int(11) NOT NULL, 
    `data_muted_server` tinyint(4) NOT NULL, 
    `data_muted_self` tinyint(4) NOT NULL, 
    `data_deafen_server` tinyint(4) NOT NULL, 
    `data_deafen_self` tinyint(4) NOT NULL, 
    `data_suppressed` tinyint(4) NOT NULL, 
    `data_status` varchar(10) NOT NULL, 
    `data_game` text, 
    `datetime_logged` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`) 
) 

CREATE TABLE IF NOT EXISTS `discord_users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `data_id` text NOT NULL, 
    `data_name` varchar(50) NOT NULL, 
    `data_avatar` text, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`) 
) 

그 쿼리로드 "나이"를 취 데이터베이스가 어떻게 보이는지 여기

SELECT d.id AS id_d, 
     d.id_user AS id_du, 
     d.id_channel AS id_dc, 
     d.datetime_logged AS logged 

FROM discord AS d 
JOIN discord_users AS du 
ON d.id_user = du.id 
WHERE datetime_logged IN (SELECT MAX(datetime_logged) FROM discord) 
ORDER BY du.data_name ASC 

그리고이다. 그러나 WHERE datetime_logged IN (SELECT MAX(datetime_logged) FROM discord)을 제거하고 LIMIT 10을 쿼리에 추가하면 페이지가 빠르게로드됩니다!


SQL 쿼리의 목적은 discord 테이블의 최신 데이터 만 가져 오는 것입니다. 데이터는 15 분마다 만 업데이트되므로 쿼리를 통해 최신 데이터를 쉽게 얻을 수 있습니다.

discorddiscord_users과의 관계는 사용자로부터 정보를 얻으려면 discord_users의 ID가 필요합니다. discorddiscord_users입니다.

는 symcbean의 질문 futhermore에 응답하려면 :

당신이 aapparently 관계의 "다"쪽의 내용을 기반으로 단일 레코드에 OUPUT을 제한하는 경우 Q) 왜, 당신에 의해 주문하는

"한쪽?

) 무엇을 의미합니까?

Q) 테이블에 차등 인덱스가 없는데도 discord_users 테이블에서 2 커서를 여는 이유는 무엇입니까?

a) 다시 한번 말하지만 무엇을 의미합니까? :)


여기 내 질문이 있습니다. SQL 쿼리를 최적화하여 페이지를로드하는 데 거의 1 분이 걸리지 않도록하려면 어떻게합니까? 페이지 링크 : https://erik-edgren.nu/discord

+2

'datetime_logged'에 대한 색인을 만드셨습니까? –

+0

미안하지만 무슨 뜻인지 정확히 모르겠습니다. 내 업데이트 된 질문을 참조하십시오. – Erik

+0

자세한 내용은 [this] (http://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html)을 참조하십시오. –

답변

0

그래도 문제가 계속되면이 옵션을 사용해보세요. datetime_loggeddiscord 표의 예 : index_datelog과 같이 INDEX을 작성하십시오. 그리고 아래의 쿼리를 시도하십시오

SELECT 
    d.id AS id_d, d.id_user AS id_du, d.id_channel AS id_dc, d.datetime_logged AS logged 
FROM 
    discord d 
JOIN 
    discord_users du ON d.id_user = du.id USE INDEX(index_datelog)) 
WHERE 
    d. datetime_logged = (SELECT MAX(datetime_logged) FROM discord) 
ORDER BY d.datetime_logged ASC 
+0

답변 해 주셔서 감사합니다. 나는 인덱스를 만들었다. (생각보다 쉬웠다. 나는 어젯밤 너무 피곤 했음에 틀림 없다.) SQL 쿼리로 페이지가 매우 빨리로드된다.검색어가 오류가 발생했습니다. '치명적 오류 : 'SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1064'메시지와 함께 'PDOException'오류가 발생했습니다. SQL 구문에 오류가 있습니다. '(INDEX (index_datelog)) 근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. d. datetime_logged = (SELECT MAX (datetime_l '행의 7 번째 줄에' – Erik

+0

오, 고맙습니다.) MSSQL의 구문입니다 .MySQL 구문 – jonju

+0

에 대한 대답이 업데이트되었습니다. 경험적 증거의 뒷부분에서만 필요합니다.) 또한 해시 인덱스는 쓸모가 없습니다. BTree 인덱스가 필요하며 정렬은 원래 쿼리에서 변경됩니다. – symcbean