超絶今更メモ。
show databases;
超絶今更メモ。
show databases;
どうやらMySQLが盛大にクラッシュしてしまったらしい。
ぐぐってみたところ、下記ファイルを削除し、mysqldのリスタートを行うと幸せになれるらしい。
rm /var/lib/mysql/ib_logfile*
これで再起動してみるもののなおらない。
どうやらmy.cnfの設定を見直す必要がある模様。
ということで下記ファイルの下記項目を下記の通り編集。
vi /etc/my.cnf
innodb_additional_mem_pool_size = 2G
再度「ib_logfile」を削除し再起動したところ無事復活。
めも。
下記の通り範囲が異なる。
■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で1万件を超えるレコードをJOINさせようとするとかなり重くなるので注意。
データ量が多すぎてバッファに載り切らない時、テンポラリ領域を使おうとするのが速度低下の原因。
目安としては1000件くらいから若干重くなり、1万件を超えると激重になるらしい。
JOINerは注意されたし。
文法のメモ。
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
めも。
たとえば特定のカラムの値が10~20のものを取得したいといった場合に便利。
WHERE col_name BETWEEN 10 AND 20
上記のSQLは「以上」、「以下」を指定するための演算子なので10と20は含まれることに注意。
またNOTを付加することで否定の条件も指定可能
WHERE col_name NOT BETWEEN 10 AND 20
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
めも。
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を発行してやれば結果的にパフォーマンスは上昇する。