1

100,000MYSQL にDb のユーザーがいます。そのDBには、列ID,username,Fname,Lnameなどがあります。いつwww.example.com/Jimまたは(usersテーブルのユーザー名とIDはwww.example.com/123どこですか)JIM123

私は MYSQL クエリを使用しています: select * from users where ID = 123 OR username = Jim PHP で上記のクエリを実行しています。上記のクエリの出力は次のとおりです。

| ID | Username | fname  | lname   |
+----+----------+--------+---------+
|123 |   jim    |  Jim   | Jonson  |

私の問題は、DB でユーザー名または ID を選択するのに非常に時間がかかることです。

次のクエリを使用しました

SELECT * FROMユーザーUSE INDEX (UsersIndexId) where id=123

これは Index を呼び出す正しい方法ですか?

EXPLAIN SELECT * FROM  `users` WHERE ID =327

OP

id  select_type  table    type    possible_keys        key      key_len ref rows Extra 
1     SIMPLE       users  Const  PRIMARY,UsersIndexId  PRIMARY     4   const   

1

4

2 に答える 2

5

これをご覧になることをお勧めします: How MySQL Uses Indexes

最初の段落からの引用:

インデックスは、特定の列の値を持つ行をすばやく見つけるために使用されます。インデックスがない場合、MySQL は最初の行から始めて、テーブル全体を読み取って関連する行を見つける必要があります。テーブルが大きいほど、このコストは高くなります。テーブルに問題の列のインデックスがある場合、MySQL は、すべてのデータを調べることなく、データ ファイルの途中でシークする位置をすばやく判断できます。テーブルに 1,000 行ある場合、これは順次読み取りよりも少なくとも 100 倍高速です。

これにより、検索が高速化されるはずです。

編集:SQLドキュメントの新しいバージョンへのリンクを更新しました)

PS:より具体的には、列インデックスが必要な場合があります。ここでインデックスの追加に関する詳細情報を見つけることができます: Create Index Syntax

于 2012-12-18T07:32:14.843 に答える
2

@Kjartanの回答を完成させるには、次のことを試すことができます:

ALTER TABLE users ADD INDEX id_i (`ID`);
ALTER TABLE users ADD INDEX username_i (`Username`);

クエリはより高速になるはずです。

于 2012-12-18T07:36:45.543 に答える