MySQL

【MySQL】databaseの一覧を取得する。

超絶今更メモ。

show databases;

 

【MySQL】Unknown table engine ‘InnoDB’。

どうやらMySQLが盛大にクラッシュしてしまったらしい。
ぐぐってみたところ、下記ファイルを削除し、mysqldのリスタートを行うと幸せになれるらしい。

rm /var/lib/mysql/ib_logfile*

これで再起動してみるもののなおらない。
どうやらmy.cnfの設定を見直す必要がある模様。

ということで下記ファイルの下記項目を下記の通り編集。

vi /etc/my.cnf
innodb_additional_mem_pool_size = 2G

再度「ib_logfile」を削除し再起動したところ無事復活。

 

【MySQL】FLOAT、DOUBLE型の違い。

めも。

下記の通り範囲が異なる。

■FLOAT
-3.402823466E+38 ? -1.175494351E-38
0
1.175494351E-38 ? 3.402823466E+38

■DOUBLE
-1.7976931348623157E+308 ? -2.2250738585072014E-308
0
2.2250738585072014E-308 ? 1.7976931348623157E+308

 

【MySQL】大量のレコードをJOINする際の注意。

MySQLで1万件を超えるレコードをJOINさせようとするとかなり重くなるので注意。

データ量が多すぎてバッファに載り切らない時、テンポラリ領域を使おうとするのが速度低下の原因。

目安としては1000件くらいから若干重くなり、1万件を超えると激重になるらしい。

JOINerは注意されたし。

 

【MySQL】UPDATE文でJOINを行う。

文法のメモ。

UPDATE
    [テーブル名A]
LEFT JOIN
    [テーブル名B]
ON
    [テーブル名A].[カラム名] = [テーブル名B].[カラム名]
SET
    [テーブル名A or B].[カラム名] = [値], ...
WHERE
    [条件]

以下例。

UPDATE
    tbl_1
LEFT JOIN
    tbl_2
ON
    tbl_1.id = tbl_2.tbl_1_id
SET
    tbl_1.col_1 = "hoge", tbl_2.col_2 = "fuga"
WHERE
    tbl_1.status = 1 AND tbl_2.status = 2

 

【MySQL】WHERE句で範囲指定する。

めも。

たとえば特定のカラムの値が10~20のものを取得したいといった場合に便利。

WHERE col_name BETWEEN 10 AND 20

上記のSQLは「以上」、「以下」を指定するための演算子なので10と20は含まれることに注意。

またNOTを付加することで否定の条件も指定可能

WHERE col_name NOT BETWEEN 10 AND 20

 

【MySQL】GROUP BYを複数カラム指定する際の注意点。

GROUP BY句を複数指定する場合は、下記の通りカンマ区切りでカラム名を指定する。

SELECT *
FROM table_name
GROUP BY col_1, col_2, col3

また下記のようにソート順をそれぞれで指定することも可能。

SELECT *
FROM table_name
GROUP BY col_1 DESC, col_2 ASC

 

【MySQL】SELECT文をチューニングするための情報を取得する。

めも。

SQLを発行する再、文の一番先頭に「EXPLAIN」とつけると、オプティマイザのデバッグ情報を取得することが出来る。

下記例。

EXPLAIN SELECT * FROM table_name WHERE id = 1

上記SQLによって取得出来る情報の「type」の欄が重要。

「type」には下記表のものが多く見られる。

system テーブルに1レコードしかない状態
const マッチするレコードが1件しかない状態。PRIMARY KEYまたはUNIQUEインデックスを利用して検索される
eq_ref JOINにおいてPRIMARY KEYまたはUNIQUEインデックスを利用して1つのレコードを検索している状態。理想的なJOINの形式
range インデックスを用いた範囲検索
index すべてのレコードのインデックスをスキャンする必要がある状態(フルインデックススキャン)
ALL すべてのレコードを走査する必要がある状態(フルテーブルスキャン)

上から順に高速なので、なるべく上に近づくようなSQLを発行してやれば結果的にパフォーマンスは上昇する。