2

主キーが user_id のテーブル users と、verified というインデックス付きの列があります。別のテーブル user_profile には、PK が profile_id として、FK が user_id としてあり、列 - name があります。

ここで、検証済みのすべてのユーザーとその名前を見つける必要があります。したがって、user_id でこれら 2 つのテーブルを結合する必要があります -

クエリは -

select p.name from user_profile p inner join user u on p.user_id = u.user_id
where u.verified = 1;

プロファイル テーブルには 700000 レコードがあり、ユーザー テーブルには同じ数のレコードがあります。上記のクエリの実行には 13 秒かかります。実行時間を最適化する方法を教えてください。

MySQL バージョン 5.5、YII

編集

CREATE TABLE IF NOT EXISTS `tbl_profile` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `regyear` int(4) DEFAULT NULL,
  `firstname` varchar(128) NOT NULL,
  `gender` varchar(10) NOT NULL,
  `occupation` int(5) NOT NULL,
  `street` varchar(255) DEFAULT NULL,
  `state` int(10) DEFAULT NULL,
  `city` int(10) DEFAULT NULL,
  `zip` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `state` (`state`),
  KEY `firstname` (`firstname`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=626494 ;

--

-- テーブルのテーブル構造tbl_user

CREATE TABLE IF NOT EXISTS `tbl_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) DEFAULT NULL,
  `password` varchar(128) NOT NULL,
  `createtime` int(10) NOT NULL DEFAULT '0',
  `lastvisit` int(10) NOT NULL DEFAULT '0',
  `status` int(1) NOT NULL DEFAULT '0',
  `verified` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  KEY `status` (`status`),
  KEY `verified` (`verified`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=626494 ;

EXPLAIN SELECT の出力 - 上記と同じクエリを作成しましたが、1 を 999 に置き換え、検証済みの代わりに列ステータスを使用しています。これは、問題ステートメントと同等です。

EXPLAIN SELECT p.firstname
FROM tbl_profile p
INNER JOIN tbl_user u ON p.user_id = u.id
WHERE u.status =999
+----+-------------+-------+------+----------------+---------+---------+-------------+--------+-------------+
| id | select_type | table | type | possible_keys  | key     | key_len | ref         | rows   | Extra       |
+----+-------------+-------+------+----------------+---------+---------+-------------+--------+-------------+
|  1 | SIMPLE      | u     | ref  | PRIMARY,status | status  | 4       | const       | 313333 | Using index |
|  1 | SIMPLE      | p     | ref  | user_id        | user_id | 4       | newone.u.id |      1 |             |
+----+-------------+-------+------+----------------+---------+---------+-------------+--------+-------------+
4

2 に答える 2