現在作成してるものでメインデータ700万件超。
メインデータに紐づくタグデータ 6000万超。
と個人でなんとかするには無茶なデータ量。
当然、INDEXを張ったりなんだり。
覚えておく事として、mysqlは基本、1INDEXしか使わない。
複数のINDEXをしようして検索しませんよと。サブクエリーとかはまたそこでINDEXを使います。
1SQLで1INDEXというわけではないので注意。
で、当然こんだけあると遅い、遅い。
せめて1秒くらいで欲しいデータをだしたい。
そこで解析に使うのが[EXPLAIN]ですが、項目の簡単な見方。
あくまで簡易的であり私の私見なので間違ってたりするかもしれません。
table:
どのテーブルが対象なのかを表してます。
type:
検索パターンを示してます。ALLは基本的には無くす方向でチューニングします。
indexの場合には要注意くらいでも大丈夫かも。
possible_keys:
INDEX名が表示されます。
row:
実行するために必要だと判定したレコードの件数。
実際の件数ではないが、その件数を見る予定なので乱暴だが少ない方がいいと考えてよい。
Extra:
色々ありますが、Using filesort、Using temporaryが表示された場合は注意した方がいい。
2017年3月24日金曜日
2017年3月22日水曜日
MYSQLでキャッシュをつかわない。
mysqlで1回目は遅いけど同じSQLでは早い。
キャッシュを使ってるので当然といえば当然ですが、チューニングしてる場合にはキャッシュを使わずに計測したい。
いつも間違うのがこっち
正しいのはこっち
というわけで備忘録です。
いつも間違うのがこっち
SELECT NOCACHE col1,....
正しいのはこっち
SELECT SQL_NO_CACHE col1,...
というわけで備忘録です。
2017年3月7日火曜日
MySQLで縦列を横列にカンマ区切りにしたい。
MySQLで縦列を横列にカンマ区切りにしたいと思い色々検索してみる。
実際にはカラムにカンマ区切りで入れたいってのが要望です。
色々調べてみるが力技がほとんど。有ってもpivotが引っかかる。
どうも自分がしたい感じではない。
タグ表示に近い。
メインデータ
タグデータ
とDBに登録されているとして。こう表示させたい
色々調べた結果MySQLに便利な関数がありました。
GROUP_CONCATです。常識?今回の件で初めてしりましたよ。 以下、こんな感じで書き求めてる結果を出せました。
| mainid | データ1 | データ2 |
|---|---|---|
| 1 | A | B |
| tagid | mainid | name |
|---|---|---|
| 1 | 1 | C# |
| 2 | 1 | MySQL |
| 3 | 1 | PHP |
| id | データ1 | データ2 | タグ |
|---|---|---|---|
| 1 | A | B | C#,MySQL,PHP |
GROUP_CONCATです。常識?今回の件で初めてしりましたよ。 以下、こんな感じで書き求めてる結果を出せました。
SELECT *
FROM main
LEFT JOIN (SELECT
mainid,
GROUP_CONCAT(name separator ',') AS タグ
FROM tag
GROUP BY mainid) tagd ON tagd.mainid = main.mainid
2013年8月18日日曜日
DataGridViewのスクロールバーがおかしくなる
VS2010で自分用のプログラムを書いててDataGridViewの動きがおかしい。
ヘッダーカラムをクリックしてソートしたり、カーソルキーなどで移動すると全部できる。
DataGridViewのスクロールバーエラーとかで、いろいろ検索してみると。
とするといいとかある。
なんか、おまじないくさくてやだ。
リフレッシュそたらなおるのかな?と思って
おまじないにしないとだめかなと思ったところでちょっと思いつく。
きっと、この動作自体はバグなんでしょうね
これも、おまじないだが自分の気分的にはこちらのほうがいい。
this.dataGridView1.Rows.Clear();
DataTable xx;
xx= データ取得;
foreach (DataRow viewdr in xx.Rows)
{
this.dataGridView1.Rows.Add(viewdr.ItemArray);
}
とやってるのだがスクロールバーで全部のデータが見られない。ヘッダーカラムをクリックしてソートしたり、カーソルキーなどで移動すると全部できる。
DataGridViewのスクロールバーエラーとかで、いろいろ検索してみると。
.VirtualMode = True .VirtualMode = False
とするといいとかある。
.ScrollBars = ScrollBars.None; .ScrollBars = ScrollBars.Both;で、治ったとか。
なんか、おまじないくさくてやだ。
リフレッシュそたらなおるのかな?と思って
this.dataGridView1.Refresh();
としてみるが、ダメ。おまじないにしないとだめかなと思ったところでちょっと思いつく。
this.dataGridView1.SuspendLayout();
this.dataGridView1.Rows.Clear();
DataTable xx;
xx= データ取得;
foreach (DataRow viewdr in xx.Rows)
{
this.dataGridView1.Rows.Add(viewdr.ItemArray);
}
this.dataGridView1.ResumeLayout();
で解決。描画を止めて、セットしてから描画するという手段で回避しました。きっと、この動作自体はバグなんでしょうね
これも、おまじないだが自分の気分的にはこちらのほうがいい。
2013年8月16日金曜日
MDBのカラム名とコメント取得
MDBのカラム名とコメント取得
メモ書きとして。
DataTable schemaTable = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
foreach (DataRow dr in schemaTable.Rows)
{
DataTable table = conn.GetSchema("Columns", new string[4] { null, null, dr["TABLE_NAME"].ToString(), null });
DataRow[] table2 = table.Select("", "ORDINAL_POSITION");
foreach (DataRow dr2 in table2)
{
List<string> col = new List<string>();
col.Add("\"" + dr2["TABLE_NAME"].ToString() + "\"");
col.Add("\"" + dr2["COLUMN_NAME"].ToString() + "\"");
col.Add("\"" + dr2["DESCRIPTION"].ToString() + "\"");
}
}
メモ書きとして。
2013年8月1日木曜日
MySQLのCHARSET
文字化けするのでPDOでSET NAMEみたいなのって調べたら
SET NAMEは脆弱性の元とかいってダメとか。
接続時にこれでOKでした。
SET NAMEは脆弱性の元とかいってダメとか。
$con = new PDO(
"mysql:host=".consClass::dbserver."; dbname=".consClass::dbname,
consClass::dbuser, consClass::dbpass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8")
);
接続時にこれでOKでした。
2013年7月31日水曜日
AMAZONのAPI(AWS)でkindleを除外する条件
パラメータに
すげー簡単に終わった。
パラメータでKindle除外できるやん。
Power=binding:not kindle追加するだけ。
すげー簡単に終わった。
パラメータでKindle除外できるやん。
登録:
投稿 (Atom)