1

私は2つのテーブルを持っています、それらの構造は以下の通りです:

CREATE TABLE  `metaservice`.`user` (
  `id` bigint(18) NOT NULL AUTO_INCREMENT,
  `userId` bigint(18) NOT NULL,
  `name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `userId` (`userId`) USING BTREE,
  KEY `nameIndex` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

CREATE TABLE  `metaservice`.`tweet` (
  `id` bigint(18) NOT NULL AUTO_INCREMENT,
  `tweetId` bigint(18) NOT NULL,
  `reqId` int(8) NOT NULL DEFAULT '0',
  `postedTime` datetime NOT NULL,
  `body` text NOT NULL,
  `userId` bigint(18) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK69A46713BA64537` (`userId`),
  KEY `reqId` (`reqId`),
  CONSTRAINT `FK69A46713BA64537` FOREIGN KEY (`userId`) REFERENCES `user` (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

以下のSQLクエリを取得しました。

select
        count(distinct user.name) as c 
    from
        tweet as tweet 
    inner join
        user as user 
            on tweet.userId=user.userId  
            and tweet.reqId in (
                327774,
            215173,
            104302,
            239188,
            317122,
            972632,
            424187,
            644254,
            946792,
            543258)

ツイート テーブルに 6W レコードがあり、ユーザー テーブルに 6w+ レコードがある場合、速度が遅すぎます。このクエリは、10.45 秒で結果:60594 を返します。

4

4 に答える 4

1

次のように EXPLAIN を使用することをお勧めします。

EXPLAIN select
        count(distinct user.name) as c 
    from
        tweet as tweet 
    inner join
        user as user 
            on tweet.userId=user.userId  
            and tweet.reqId in (
                327774,
            215173,
            104302,
            239188,
            317122,
            972632,
            424187,
            644254,
            946792,
            543258)

次に、EXPLAIN が返す応答を分析します。MySQL Explain の詳細については、次のソースを参照してください。

MySQL Explain 構文

Explain を使用してクエリを最適化する

MySQL Explain の使用

MySQL Explain リファレンス

結果を確認したら、インデックスを作成する列を決定する必要があります。

于 2012-10-31T09:39:31.497 に答える
0

これを試してみてください -

SELECT
  COUNT(DISTINCT user.name) AS c
FROM
  tweet AS tweet
INNER JOIN user AS user
  ON tweet.userId = user.userId
INNER JOIN (
    SELECT 327774 AS reqId UNION
    SELECT 215173 UNION
    SELECT 104302 UNION
    SELECT 239188 UNION
    SELECT 317122 UNION
    SELECT 972632 UNION
    SELECT 424187 UNION
    SELECT 644254 UNION
    SELECT 946792 UNION
    SELECT 543258
  ) t
  ON tweet.reqId  = t.reqId;
于 2012-10-31T10:20:20.000 に答える
0

キーにインデックスを付けることをお勧めします。インデックスは、主キーや一意のキーだけのものではありません。検索するテーブルに列がある場合は、ほとんどの場合、それらにインデックスを付ける必要があります。

そのリンクも読んでください

于 2012-10-31T09:44:42.700 に答える
0

これを試して:

select count(*) as c from (
select
       user.name 
    from
        tweet as tweet 
    inner join
        user as user 
            on tweet.userId=user.userId  
            and tweet.reqId in (
                327774,
            215173,
            104302,
            239188,
            317122,
            972632,
            424187,
            644254,
            946792,
            543258)
group by user.name) a
于 2012-10-31T09:41:00.627 に答える