0

私は進行中のプロジェクトを持っていますが、それは非常に小さく始まり、非常に急速に成長したため、(よく整理され、考え抜かれたという点で)少し​​手に負えなくなっています。

とにかく、ユーザーアクティビティを追跡し、UUIDを記録し、特定の連絡先アクティビティを記録するシステムがあります。これを使用して、顧客がサイトで何を見ているかに関する情報を生成します。かなり標準的です。とにかく、それは少し複雑で遅くなりました、そして私はクエリを最適化する助けを期待しています。

現在使用している方法よりも(おそらくJOINSを使用して)はるかに優れた方法があると確信していますが、頭を悩ませることはできないようです。いくつかの助けをいただければ幸いです。関連情報は以下のとおりです。

ありがとう。

テーブル:visitor_activity

CREATE TABLE `visitor_activity`(
 `vaid` int(11)NOT NULL AUTO_INCREMENT、
 `uuid` varchar(128)DEFAULT NULL、
 `ip_address` varchar(15)DEFAULT NULL、
 `datetime` datetime DEFAULT NULL、
 `url` varchar(255)DEFAULT NULL、
 `user_agent` varchar(255)DEFAULT NULL、
 主キー( `vaid`)、
 KEY `uuid`(` uuid`)、
 キー`ip_address`(` ip_address`)
)ENGINE = MyISAM AUTO_INCREMENT = 70134 DEFAULT CHARSET = utf8

テーブル:contact_uuids

CREATE TABLE `contact_uuids`(
 `contact_id` int(11)NOT NULL DEFAULT '0'、
 `uuid` varchar(128)NOT NULL DEFAULT''、
 主キー( `contact_id`、` uuid`)、
 キー`contact_id`(` contact_id`)、
 KEY `uuid`(` uuid`)
)ENGINE = MyISAM DEFAULT CHARSET = utf8

テーブル:contact_log

CREATE TABLE `contact_log`(
 `contact_log_id` int(11)NOT NULL AUTO_INCREMENT、
 `contact_id` int(11)NOT NULL、
 `datetime` datetime NOT NULL、
 `action` varchar(128)NOT NULL、
 `performed_by` varchar(64)NOT NULL、
 `ip_address` varchar(15)NOT NULL、
 主キー( `contact_log_id`)、
 キー`contact_id`(` contact_id`)、
 キー`ip_address`(` ip_address`)、
 KEY `performed_by`( `performed_by`)
)ENGINE = MyISAM AUTO_INCREMENT = 9017 DEFAULT CHARSET = utf8

現在のSQLステートメント:

SELECT DISTINCT( `va`.`vaid`)、
         `va`.`datetime`、
         `va`.`uuid`、
         `va`.`ip_address`、
         `va`.`url`
FROM `visitor_activity`` va`
WHERE `va`.`uuid` IN(SELECT` uuid` FROM `contact_uuids`` cu` WHERE `cu`.`contact_id` = '1')||
         `va`.`ip_address` IN(SELECT DISTINCT(` ip_address`)FROM `contact_log`` cl` WHERE` cl`.`contact_id` = '1' && `performed_by` ='Contact')
ORDER BY `va`.`datetime` DES
4

1 に答える 1

1

クエリを2つの選択に分割して異なるテーブルを結合し、を使用unionしてすべてのデータを結合します。クエリは次のようになります。

(SELECT   DISTINCT(`va`.`vaid`),
     `va`.`datetime`,
     `va`.`uuid`,
     `va`.`ip_address`,
     `va`.`url`
FROM     `visitor_activity` `va`,`contact_uuids` `cu`
WHERE    `va`.`uuid`=`cu`.`uuid`
and `cu`.`contact_id` = '1')
UNION
(SELECT   DISTINCT(`va`.`vaid`),
     `va`.`datetime`,
     `va`.`uuid`,
     `va`.`ip_address`,
     `va`.`url`
FROM  `visitor_activity` `va`,`contact_log` `cl`
where `va`.`ip_address` = `cl`.`ip_address` 
and `cl`.`contact_id` = '1' and `performed_by` = 'Contact')
ORDER BY datetime DESC
于 2012-06-20T21:38:47.020 に答える