2012-02-15 9 views
0

を改善します所有者 - 営業担当者。私は彼の連絡先の所有者の訪問に示す必要があります。は、私は、このようなクエリが持っているクエリのパフォーマンス

訪問数はADM_VISIT_GROUPテーブル - > 200,000行に格納されます。訪問にはADM_CONTACTを指すcontact_idカラムがあります。 連絡先はADM_CONTACTテーブルに格納されます。約500,000行です。 連絡先の所有権は、ADM_CONTACT_OWNER表に格納されます。これは、ADM_CONTACTの場合と多かれ少なかり同じ行数です。

はショーを説明する:

CREATE TABLE `ADM_VISIT_GROUP` (
    `ID` char(128) COLLATE utf8_polish_ci NOT NULL, 
    `UUID` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `CONTACT_STATE` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `VISIT_ID` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `HOST` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `IP` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `LOCATION` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `URI` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `TIME` datetime DEFAULT NULL, 
    `CONVERSATION` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `DURATION` bigint(20) DEFAULT NULL, 
    `VISIT_SOURCE` varchar(255) COLLATE utf8_polish_ci NOT NULL, 
    `VISIT_SOURCE_HOST` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `VISIT_SOURCE_KEYWORDS` varchar(1024) COLLATE utf8_polish_ci DEFAULT NULL, 
    `VISIT_SOURCE_DETAILS` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `VISIT_SCORE` bigint(20) DEFAULT NULL, 
    `CLIENT` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `EMAIL` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `CONTACT_ID` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `CONVERSATION_ID` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `IP_ORGANIZATION` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL, 
    `ISP_ONLY` tinyint(1) DEFAULT NULL, 
    `VENDOR_ID` varchar(255) COLLATE utf8_polish_ci NOT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `FK_VISIT_GROUP_VENDOR_ID` (`VENDOR_ID`), 
    KEY `IDX_VISIT_GROUP_VENDOR_ID_CONTACT_ID` (`VENDOR_ID`,`CONTACT_ID`), 
    KEY `IDX_VISIT_GROUP_ISP_ONLY_VENDOR_ID_CONTACT_ID` (`ISP_ONLY`,`VENDOR_ID`,`CONTACT_ID`), 
    KEY `IDX_VISIT_GROUP_TIME` (`TIME`), 
    KEY `IDX_VISIT_GROUP_EMAIL` (`EMAIL`), 
    KEY `IDX_VISIT_GROUP_CONTACT_ID` (`CONTACT_ID`), 
    CONSTRAINT `FK_VISIT_GROUP_VENDOR_ID` FOREIGN KEY (`VENDOR_ID`) REFERENCES `ADM_VENDOR` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci 

表のADM_CONTACT_OWNER:

CREATE TABLE `ADM_CONTACT_OWNER` (
    `ID` char(128) COLLATE utf8_polish_ci NOT NULL, 
    `VERSION` int(11) NOT NULL, 
    `CONTACT_ID` varchar(255) COLLATE utf8_polish_ci NOT NULL, 
    `OWNER_ID` varchar(255) COLLATE utf8_polish_ci NOT NULL, 
    `CREATED_ON` datetime NOT NULL, 
    `OWNERSHIP_RIGHTS` varchar(255) COLLATE utf8_polish_ci NOT NULL, 
    `GRANTED_BY_ID` varchar(255) COLLATE utf8_polish_ci NOT NULL, 
    `MODIFIED_ON` datetime NOT NULL, 
    `DELETED` tinyint(1) NOT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `CONTACT_ID` (`CONTACT_ID`,`OWNER_ID`), 
    KEY `FK_CONTACT_OWNER_GRANTED_BY_ID` (`GRANTED_BY_ID`), 
    KEY `FK_CONTACT_OWNER_CONTACT_ID` (`CONTACT_ID`), 
    KEY `FK_CONTACT_OWNER_OWNER_ID` (`OWNER_ID`), 
    KEY `IDX_CONTACT_OWNER_CONTACT_OWNER` (`CONTACT_ID`,`OWNER_ID`), 
    KEY `IDX_CONTACT_OWNER_OWNER_DELETED` (`OWNER_ID`,`DELETED`), 
    CONSTRAINT `FK_CONTACT_OWNER_CONTACT_ID` FOREIGN KEY (`CONTACT_ID`) REFERENCES `ADM_CONTACT` (`ID`), 
    CONSTRAINT `FK_CONTACT_OWNER_GRANTED_BY_ID` FOREIGN KEY (`GRANTED_BY_ID`) REFERENCES `ADM_USER_ACCOUNT` (`ID`), 
    CONSTRAINT `FK_CONTACT_OWNER_OWNER_ID` FOREIGN KEY (`OWNER_ID`) REFERENCES `ADM_USER_ACCOUNT` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci 

全クエリ:

select 
visitgroup0_.VISIT_ID as col_0_0_, 
visitgroup0_.DURATION as col_1_0_, 
visitgroup0_.TIME as col_2_0_, 
visitgroup0_.VISIT_SOURCE as col_3_0_, 
visitgroup0_.VISIT_SOURCE_HOST as col_4_0_, 
visitgroup0_.VISIT_SOURCE_KEYWORDS as col_5_0_, 
visitgroup0_.EMAIL as col_6_0_, 
visitgroup0_.IP_ORGANIZATION as col_7_0_, 
visitgroup0_.CLIENT as col_8_0_, 
visitgroup0_.HOST as col_9_0_, 
visitgroup0_.IP as col_10_0_, 
visitgroup0_.LOCATION as col_11_0_, 
visitgroup0_.URI as col_12_0_, 
visitgroup0_.UUID as col_13_0_, 
visitgroup0_.VISIT_SCORE as col_14_0_, 
visitgroup0_.CONVERSATION as col_15_0_, 
visitgroup0_.CONTACT_ID as col_16_0_, 
visitgroup0_.CONVERSATION_ID as col_17_0_ 
from 
ADM_VISIT_GROUP visitgroup0_, 
ADM_CONTACT_OWNER contactown1_ 
where 
visitgroup0_.TIME>'2012-02-14 02:59:24' and 
visitgroup0_.VENDOR_ID='3739d7a7-2e8f-4409-bd2d-2b505b5e7749' and 
visitgroup0_.CONTACT_STATE='PROSPECT' and 
contactown1_.CONTACT_ID=visitgroup0_.CONTACT_ID and 
contactown1_.OWNER_ID='3f440a3e-a55e-44f5-ac75-d30bd27f4f97' 
order by visitgroup0_.TIME desc limit 30; 

+----+-------------+--------------+--------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+---------+------------------------------------------------+-------+--------------------------+ 
| id | select_type | table  | type | possible_keys                             | key     | key_len | ref           | rows | Extra     | 
+----+-------------+--------------+--------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+---------+------------------------------------------------+-------+--------------------------+ 
| 1 | SIMPLE  | visitgroup0_ | range | FK_VISIT_GROUP_VENDOR_ID,IDX_VISIT_GROUP_VENDOR_ID_CONTACT_ID,IDX_VISIT_GROUP_TIME,IDX_VISIT_GROUP_CONTACT_ID     | IDX_VISIT_GROUP_TIME | 9  | NULL           | 19640 | Using where    | 
| 1 | SIMPLE  | contactown1_ | eq_ref | CONTACT_ID,FK_CONTACT_OWNER_CONTACT_ID,FK_CONTACT_OWNER_OWNER_ID,IDX_CONTACT_OWNER_CONTACT_OWNER,IDX_CONTACT_OWNER_OWNER_DELETED | CONTACT_ID   | 1534 | salesmanago_main.visitgroup0_.CONTACT_ID,const |  1 | Using where; Using index | 
+----+-------------+--------------+--------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+---------+------------------------------------------------+-------+--------------------------+ 

ADM_VISIT_GROUPテーブルを使用して作成しました

誰でもこのクエリの速度を向上させるのに役立つことができますか?

+0

編集されたものがADM_ *を使用しているのに対して、完全なクエリでSM_ *テーブルが使用されるのはなぜですか? – vulkanino

+0

typo、申し訳ありません...私はポストを更新しました...私はローカルで2つのスキームを持っています – Konrad

+0

あなたは 'SM_CONTACT_OWNER'テーブルからデータを選択しないことに加えて、私はJOINを使用する以外の特定の問題は表示しません。 – vulkanino

答えて

1

MySQLは唯一作ってみる、クエリでテーブルごとに単一のインデックスを使用することができますので、それは(IDX_VISIT_GROUP_TIME)手動のみTIMEにインデックスを使用することができるという理由のMySQLの行の多くをフィルタリングする

を持っています結合インデックス:

インデックスの順序は重要です。すべての句がクエリに含まれている場合は、インデックスは最初の句から最後の句までしか使用できません。 >などを使用すると、おそらくインデックスの残りの部分は使用できなくなります。そのため、TIMEは索引の最後です。

ただし、特定の列のwhere句には表示されませんが、TIME列のインデックスの部分には到達できず、インデックスの効果はあまり効果がありません。そのような場合、これらの列で別々の索引を作成する必要があります。

私は希望
+0

ありがとう!ちょうど5分前にそれをやった。 19640行 - > 39 !!私は愚かだと思う - しかし多分それは最後の5日間3時間/日未満の睡眠のためにこのDBを最適化するためです:-) 私はstackoverflowを愛しています:) – Konrad

0

  • 変更VARCHARからUNSIGNED INTEGERまたはその他の数値型
  • からOWNER_IDVENDOR_IDCONTACT_IDデータ型は外国人であることをJOIN
  • ADM_VISIT_GROUP間と ADM_CONTACT_OWNER変更 CONTACT_STATEを使用しますキーを STATEテーブルに移動するか、数値フィールドを使用する
  • 01を改善する作成
+0

Yip ...長期的なソリューションのような整数の縫い目に変わる、たくさん...ありがとう... – Konrad

関連する問題