MySQL

information_schema.tables.table_rowsの値を参考にしてはいけません

DBAの方々には既知の情報ですが、 デイリーでテーブルから取得している行数が減っていることに気づき、「あれDELETEなんかしてないはず」と思い調べたところ、 公式にありました。 TABLE_ROWS カラムはテーブルが INFORMATION_SCHEMA のデータベースにある場…

Using where; Using index; Not exists

EXPLAINでExtraフィールドに表題のInfo『Using where; Using index; Not exists』が表示されていた場合 クエリチューニングの余地があります。まいどお世話になります日本男児先生 Using where・・・頻繁に出力される追加情報である。WHERE句に検索条件が指…

WHERE句のORの後ろはINDEXが効かない

タイトルでそのまま完結してしまっていますが、 ORを使用した場合、INDEXが効くのは左辺のみ■「そもそもORを使うな」という話 ■どうしても使わざるを得ないケースがあったとしても、クエリを二回実行するほうがベター ということであります。 7.INはINDEX…

データ更新時に、元データを別カラムに追記録していく(際の注意点も)

CONCAT関数が使える mysql> UPDATE tbl SET status='NG', up_time = NOW(), up_time_log = CONCAT(IFNULL(up_time_log,''),CONCAT(',',up_time)) WHERE id = ? 例えば、上記SQLのように更新時間をup_time_logカラムに全て残しておきたい場合(ログデータを取…

mysqlimport: Error: 13, Can't get stat of 'file.txt' (Errcode: 2), when using table:

今回も備忘(たぶん3回目くらい) ファイルからテーブルにMySQLインポートしようとすると、 mysqlimport -h host hoge -u user -p /path/file.txt mysqlimport: Error: 13, Can't get stat of 'file.txt' (Errcode: 2), when using table: というエラー 原因…

ORDER BY … LIMIT処理を最適化する

数万行のテーブルをORDER BYしているSQLが遅い。EXPLAINすると「Using Filesort」の文字が。「Using Filesort」とは、テンポラリファイルを使ってソートしようとしているとの説明なので、INDEXでFetchできれば解決します。ところが、 MySQL で ORDER BY の解…

日付の単位をずらしてデータを整形する(DATE_FORMAT関数を使用)

帳票出力で、日の始まりをPM00:00としたいとき、 DATE_FORMAT()関数のformat指定子%rによって午前中か午後かを識別し、午前中であれば前日の日付に変換する。あとは日付でGROUPBYして出力例) $sql = "SELECT COUNT(*) AS cnt, SUM(price) AS sum, CASE SUBS…

coalesce関数

SELECT coalesce(sum(column),0) as price FROM table WHERE id = ? のようなSQLにて、coalesceという関数が使われている。 COALESCE(list)リスト内の最初の非 NULL 要素を返す。mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NUL…

テーブルのインポート・エクスポート

MySQLにてテーブルインポートする際、コマンドオプションの並び順によってはエラーになった。 $ mysqlimport -h host名 DB名 Table名.txt -u user名 -p Enter password: mysqlimport: Error: Access denied for user 'user'@'%' (using password: YES), when…

テーブル情報のコメントまで取得する方法

desc(describe)やshow columnsコマンドではCOMMENTデータまで取得できない というわけで公式より FULL キーワードは、各カラムに対するプレ カラム コメントと同じように、アウトプットが今持っている権限を含むように働きかけます。 相変わらず、この説明が…

SQLで基準点からの日時計算

DBに、「開始点」と「終了点」のdatetimeを放り込むとして、一方が入力値、もう一方は計算により導き出されるケースがあります。当然、プログラムで計算してクエリに渡してあげることはできますが、SQLの日付時刻関数で計算してあげたほうが、キレイなパター…