4

私はMySQLデータベースを使用しており、2 つのテーブルがあります。彼らはUserReservation

これが私の質問です。

  1. 現在、LEFT JOINSubQuery with を使用していましたNOT EXIST。パフォーマンスの観点からどちらが優れていますか?
  2. このクエリのビューを作成できますか、パフォーマンスに違いはありますか

ユーザー

| FIELD |        TYPE | NULL | KEY | DEFAULT |          EXTRA |
|-------|-------------|------|-----|---------|----------------|
|   uid |     int(11) |   NO | PRI |  (null) | auto_increment |
| uname | varchar(30) |  YES |     |  (null) |                |

予約

|    FIELD |      TYPE | NULL | KEY |           DEFAULT |          EXTRA |
|----------|-----------|------|-----|-------------------|----------------|
|      rid |   int(11) |   NO | PRI |            (null) | auto_increment |
|      uid |   int(11) |  YES | MUL |            (null) |                |
| reserved | timestamp |   NO |     | CURRENT_TIMESTAMP |                |

SQL コード:

create table user (
 uid int not null auto_increment,
 uname varchar(30),
 primary key(uid)
);

create table reservation (
 rid int not null auto_increment,
 uid int,
 reserved timestamp not null default CURRENT_TIMESTAMP,
 primary key(rid),
 foreign key (uid) references user (uid)
)

私の現在の作業 SQL クエリ

SELECT u.uid, u.uname, date_format(reserved, '%Y%m')  
FROM user as u 
LEFT JOIN reservation as r on  
r.uid = u.uid and date_format(reserved, '%Y%m') = 201307  
where r.uid is null  
4

4 に答える 4

2

パフォーマンスの違いに関する優れた記事: NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL

概要:

...MySQL で欠損値を検索する最良の方法は、NOT EXISTS ではなく LEFT JOIN / IS NULL または NOT IN を使用することです。

ただし、予約済みの列にインデックスを配置し、次のようにクエリを書き直すことで、パフォーマンスを少し向上させることができます。

reserved >= '2013-07-01 00:00:00' AND reserved < '2013-08-01 00:00:00'

ビューによってクエリのパフォーマンスが変わることはありません。

于 2013-08-28T09:43:22.883 に答える
1

問題は、date_formatMySQL インデックスが使用されない場合です。次のようなものを使用する必要があります。

reserved >= '2013-07-01 00:00:00' AND reserved < '2013-08-01 00:00:00'

インデックスが使用されるよりもクエリが高速になります。テーブル予約に複合インデックスがあり、フィールドがある場合、uid, reserved

于 2013-08-28T09:40:56.200 に答える
0

NOT EXISTSこれは非常に単純なクエリであるため、便利であっても、ビューを作成してもあまり効果がありません。

参照: LEFT OUTER JOIN と NOT EXISTS の SQL パフォーマンス

于 2013-08-28T09:42:08.347 に答える
0

これは存在しない方が良いでしょう。

SELECT u.uid, u.uname, date_format(reserved, '%Y%m')  
FROM user as u where not exist (select 1 from reservation as r   
where r.uid = u.uid and date_format(reserved, '%Y%m') = 201307)

ビューはパフォーマンスにあまり役立ちません。主に、再利用性、データの隠蔽、およびセキュリティ上の理由が懸念されます。

于 2013-08-28T09:40:17.530 に答える