ラベル world の投稿を表示しています。 すべての投稿を表示
ラベル world の投稿を表示しています。 すべての投稿を表示

2014年1月28日火曜日

でも、varchar型を使用してインデックスを使用してください| | CHAR

Original post: http://anothermysqldba.blogspot.com/2014/01/use-your-index-even-with-varchar-char.html

私は最近、上のポストに気づいforums.mysql.comのサイトを: 3百万レコードを検索する早送りするには? 
与えられた例は、LIKE '%のEED」を使用 

つまり、インデックスを活用していないし、全表スキャンを行います。 
下の世界のデータベースを使用した例ですが、そうではない300万たレコードが、ちょうどそれがどのように動作するかを示すためにしようとしています。 

> explain select * from City where Name LIKE '%dam' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.01 sec)

[world]> select count(*) FROM City;
+----------+
| count(*) |
+----------+
| 4079 |
+----------+

> select * from City where Name LIKE '%dam';
+------+------------------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population
+------+------------------------+-------------+----------------+------------+
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 1146 | Ramagundam | IND | Andhra Pradesh | 214384 |
| 1318 | Haldwani-cum-Kathgodam | IND | Uttaranchal | 104195 |
| 2867 | Tando Adam | PAK | Sind | 103400 |
| 3122 | Potsdam | DEU | Brandenburg | 128983 |
+------+------------------------+-------------+----------------+------------+
さらにポイントを表示するには 

> explain select * from City where Name LIKE '%dam%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.00 sec)

> select * from City where Name LIKE '%dam%';
+------+------------------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population |
+------+------------------------+-------------+----------------+------------+<
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 380 | Pindamonhangaba | BRA | São Paulo | 121904 |<
| 625 | Damanhur | EGY | al-Buhayra | 212203 |
| 1146 | Ramagundam | IND | Andhra Pradesh | 214384 |
| 1318 | Haldwani-cum-Kathgodam | IND | Uttaranchal | 104195 |
| 1347 | Damoh | IND | Madhya Pradesh | 95661 |
| 2867 | Tando Adam | PAK | Sind | 103400 |
| 2912 | Adamstown | PCN | – | 42 |
| 3122 | Potsdam | DEU | Brandenburg | 128983 |
| 3177 | al-Dammam | SAU | al-Sharqiya | 482300 |
| 3250 | Damascus | SYR | Damascus | 1347000 |
+------+------------------------+-------------+----------------+------------+<
12 rows in set (0.00 sec) 

上記のExplain出力は、インデックスが使用されていないことを示しています。 

CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB
<

だから、にやにや笑いのために私たちはVARCHARフィールドにキーを入れてみましょう。 私は最初の数文字範囲全体にキーを入れないで注意してください。 もちろんこれは、データに依存している。 

> ALTER TABLE City ADD KEY name_key(`Name`(5));
Query OK, 0 rows affected (0.54 sec)

CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
KEY `name_key` (`Name`(5)),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB

だから、これはあっても関係あります? 

> explain select * from City where Name LIKE '%dam' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.00 sec) 

いいえ、それが原因LIKE '%ダム」に関係なく、フルスキャンを強制的に、問題ではありません。 

> EXPLAIN select * from City where Name LIKE '%dam' AND CountryCode = 'IND' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ref
possible_keys: CountryCode
key: CountryCode
key_len: 3
ref: const
rows: 341
Extra: Using index condition; Using where
1 row in set (0.00 sec) 

上記のExplain出力の違いに注目してください。 このクエリは、インデックスを使用しています。 これは、指標として名前を使用していないが、それはインデックスを使用している。 それでは、どのようにvarchar型のインデックスを利用することができますか? 

> EXPLAIN select * from City where Name LIKE 'Ra%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: range
possible_keys: name_key
key: name_key
key_len: 5
ref: NULL
rows: 35
Extra: Using where
1 row in set (0.00 sec) 

上記のクエリはname_keyインデックスを使用します。 

ポイント幸福を使用すると、SQLクエリを記述して、クエリのための選択の最適なインデックスを見つけるために説明して実行されるようには注意しなければならないことである。

2013年7月23日火曜日

MySQLのサンプルデータベース

Original post http://anothermysqldba.blogspot.com/2013/07/mysql-sample-databases.html

私は上の記事を見たforums.mysql.comサンプルデータベースに関するサイトを、私はそれが他の人のためにそれらに簡単な概要を与えるポスト価値があるかもしれないと思った。

サンプルデータベースは、ここで見つけることができます: http://dev.mysql.com/doc/index-other.html
あなたは、MySQLのコマンドラインを介してこれらのデータベースをロードすることができます。

$ tar -vxf sakila-db.tar.gz
$cd sakila-db
$ mysql -u root -p < sakila-schema.sql
Enter password:
$ mysql -u root -p < sakila-data.sql
Enter password:

$ gzip -d world_innodb.sql.gz
$ mysql -u root -p -e "DROP SCHEMA IF EXISTS world";
Enter password:
$ mysql -u root -p -e "CREATE SCHEMA world";
Enter password:
$ mysql -u root -p world < world_innodb.sql
Enter password:

あなたのアイデアを得る。 SakilaというサンプルデータベースがドロップSCHEMAを持っており、そのスキーマにその手順を実行する必要はありませんので、ファイルでSCHEMAコマンドを作成。

また、このデータをロードするためのMySQL Workbenchを使用することができます。
  • あなたのデータベースへの接続ハンドルを作成します。
  • サーバー管理インスタンスをセットアップするには、この新たに作成された接続ハンドルを使用してください。
  • あなたの新しいインスタンスをダブルクリックします。
  • データのエクスポート/復元]の下には、データのインポートが表示されるはずです。
  • 自己完結型ファイルからインポート
    • ファイルパスはSakilaという-data.sqlにために繰り返してからSakilaという-schema.sqlの場所になります
    • スキーマを選択するか、世界の場合は、新しいものを作成することができます。
    • インポートを開始し選択してから、インポートの進行状況表示になります。
今、あなたのデータベースのサンプルデータベースへのアクセスを持っている。

$ mysql -u root -p
>使用Sakilaという
>テーブルを示す;
>俳優リミット3から*を選択します。
+ ---------- + ------------ + ----------- + ------------- -------- +
| ACTOR_ID | FIRST_NAME | last_nameの| LAST_UPDATE |
+ ---------- + ------------ + ----------- + ------------- -------- +
| 1 | PENELOPE |ギネス| 2006-02-15四時三十四分33秒|
| 2 | NICK | WAHLBERG | 2006-02-15 4時34分33秒|
| 3 | ED | CHASE | 2006-02-15 4時34分33秒|
+ ---------- + ------------ + ----------- + ------------- -------- +
ベンチ経由:
  • Adminタブを閉じます
  • SQL開発の下に接続ハンドルを選択してください
  • どちらかだけの俳優の上限3 SELECT * FROMを入力することができ、そして照明ボルトを打つ。
  • または、コマンドの一部を入力し、二重、それはあなたの名前を取り込む持っているテーブル名やカラム名をクリックすることができます。 その後、照明ボルトを選択します。
今、あなたは一緒に遊んで、学習を開始するデータを持っている。

あなたはこれにテーブルを追加したい場合は、MySQLのコマンドラインを使用するか、またはSQL開発、右がお好みのスキーマの下の "テーブル"をクリックし、 "新しいテーブルを作成"