2011-12-22 15 views
1

私は大きなテーブルをインデックスする手が必要です!そして私はこのmysqlクエリとインデックスどのようにそれを行う

インデックスMySQLのテーブルについては考えている私は、テーブルに新しいポストをinserした後、インデックスに、このテーブルをインデックスを使用することができますどのようにテーブル

     SELECT "posts.* AS `posts` , user.nickname AS nickname 
         FROM `posts` 
         LEFT JOIN user AS user ON (user.userid = posts.userid) 
         WHERE 
         posts.userid= '" . intval($bbinfo['userid']) . "' 
         ORDER BY posts.timestamp DESC 
         LIMIT $start , $_limit 
         " 

から行を注文する場合、クエリのですか?または私はインデックステーブルとどのように使用することができますいつどこでテーブルを警告することによって?助けてください

答えて

1

インデックスを一度追加するだけです。すべてのINSERTの後に何かをすることについて心配する必要はありません。それは非常にうまく機能していないようならば、私はその後、MySQL Documentation on CREATE INDEXをチェックして、のいずれかどうかを確認するためにあなたに助言する

CREATE INDEX posts_userid_idx ON posts(userid); 

:あなたはあなたのポストに持っているもの - に基づいて、私はこのような何かをしようとするだろう利用可能なオプションがあなたの状況に当てはまります。

あなたの(改訂された)コメントに基づいて、postidにもPRIMARY KEYを追加する必要があります。

ALTER TABLE posts ADD PRIMARY KEY (postid); 

もちろん、他のクエリと同様に、両方のコマンドをMySQL Workbenchで実行できるはずです。

+0

こんにちは 'postid'はint(11)NOT NULL AUTO_INCREMENT、 ' userid'はint(11)NOT NULL、 'posteruserid'はint(11)NOT NULLと、 'テキスト私のテーブルの上にこれを持っていますNULL、 'timestamp' int(11)NOT NULL、 ' position' char(55)NOT NULL、 'poster' char(55)NOT NULL、 ' mhash' varchar(55)NOT NULL、 PRIMARY KEY( 'postid')、 KEY' wallerid'( 'wallerid')、 KEY' wallerid_2'( 'wallerid') とどのようにあなたのクエリを実行するには? MySQLのクエリを使用して? –

+0

問題はありません、@ JackKFouani。あなたはこのサイトを初めて利用しているので、答えに「ありがとう」と言ったり、「受け入れる」こと、または+1を与えることが最善の方法を追加したかっただけです。ありがとう。 – Aaron

+0

テーブルがインデックスされているかどうかを知るためにどのように実行できますか?私はPHPとMySQLを使用して、私は上記のクエリを実行しようとしていたが、EXPLAINを使用してそのショーは2つの空の行を笑、私はインデックスについての研究の多くを作ったが、その理解するのは難しいので、私はsshを使用することはできません –

2

インデックスを作成し、インデックスの仕組みを定義するだけです。それから、あなたは何もしません。 SQLストレージエンジンがあなたのインデックスを使用すべきだと思うなら、彼はそれを使用します。また、データを作成または更新すると、データは更新されます。

ここで難しい部分はインデックスの定義です。

電話帳を使用すると、の注文のようなインデックスが表示されます。あなたの電話帳は、都市名、次にlastName、次にファーストネームで注文されます。これはテーブルの近くに格納された鉱石で、エンジンがテーブルのデータ全体を読み取る必要がある場合よりも高速に結果を見つけることができます。

電話帳にはインデックスが1つしかないため、データはそのインデックスに登録されています。データベースにはいくつかのインデックスを持つことができるので、テーブルの近くに格納され、実際のデータアドレスへのポインタを含んでいます。

データを検索する場合、インデックスは非常に重要です。ニューヨークでスミス氏を簡単に見つけることができます。すべての米国の都市でスミスを見つけるのは難しいです(電話帳で)。

クエリでは、インデックスを利用する2つの手順があります。あなたはユーザーでフィルタリングし、次にタイムスタンプで注文しています。

ユーザーがインデックスを作成してタイムスタンプを作成した場合、エンジンは既にインデックスを読み取るだけで、クエリの解決方法を既に持っています。

だから、私はこの1つ作成します。

CREATE index posts_user_and_timestamp_idx ON posts(userid, timestamp DESC); 

をそして、このインデックスは、(電話帳のようなあなたは、簡単に1つの都市に関するページを抽出することができます。)あなたは、単にユーザーがフィルタリングされているすべてのクエリのために再利用できます。しかし、唯一のフィルターがタイムスタンプである照会(タイムスタンプのみの索引が必要です。電話帳からすべての都市のすべてのスミスを抽出するのは難しいでしょう)。

実際、インデックスの主な問題は、です。これらは、通常、データベースで使用しているクエリに大きく依存しています。あるテーブルで同じ種類のクエリを使用することが決してない場合は、多くの異なるインデックスが必要になります。インデックスとは、場所を奪うものです。ほとんどのテーブルでは、データよりも索引に3つまたは4つ多くの物理スペースが使用されています。

+0

タイムスタンプについての良い点、+1 – Aaron

+0

ありがとう、しかし、どのように私はテーブルがインデックスされていることを確認することができますか?私はMySQLを照会するためにPHPを使用しています。私はローカルサーバーで自分のラップトップでサーバーを実行しているのでsshを使用できません。 –

+0

データベースに直接アクセスできない場合(コマンドを実行する場合)、DBA誰か他の人は誰ですか? – Aaron

2

インデックスの追加を含む、dbsのスキーマ変更が非常に一般的な作業であるため、MySQL管理ツールが役に立ちます。

私はMySQL Workbenchを使用して、テーブルのインデックスを設定するなど、ほとんどのスキーマ操作を行います。これは、mySQL DBのための無料の管理アプリです。あなたがそれを持っていないなら、それをダウンロードしてください。

http://dev.mysql.com/downloads/workbench/5.1.html

、WorkbenchであなたのDBを開いて右にインデックスを追加し、テーブルの変更を選択するために、テーブルの上に...]をクリックします。次に、ウィンドウの下部にあるインデックスをクリックして、あなたがに似たものが表示されます。

enter image description here

また、私見を備え付けるために、もう少し複雑で、少し難しいですPHPMyAdminのを、使用することができます。

Program Filesディレクトリ(Windows XP)にドリルダウンして、PHPMyAdmin実行可能ファイルを見つけました。このファイルはアプリを起動しました。

PHPMyAdminから3.2.1 - スキーマを開きます。テーブルをクリックすると、索引付けされる列の右側の照明ボルト付きのアイコンを使用して簡単に索引を指定できるGUIメニューが表示されます。 enter image description here

+0

大変ありがとうございます;これは私にとっては非常に便利でした;) –

+0

テーブルをインデックスした後、EXPLAIN SELECT * FROM blaaのような追加のものを使わずに通常のクエリを使うことができますか? –

+0

設定インデックスは、SQLの入力方法には影響しません。 – jamesTheProgrammer

関連する問題