チューニング
キャッシュを使わない
インデックス情報の確認
show index from <テーブル名>
統計情報の再取得
analyze table <テーブル名>
スキーマ情報
select column_name from INFORMATION_SCHEMA.COLUMNS
ストアドサンプル
create table t (a int auto_increment primary key, b int,c int, unique index u_in (b));
insert into t(b,c) values (2,20);
insert into t(b,c) values (3,40);
DROP PROCEDURE IF EXISTS p;
DELIMITER //
CREATE PROCEDURE p (IN inb INT, IN inc INT)
BEGIN
UPDATE t SET C = inc WHERE B = inb and c = 20;
IF ROW_COUNT() = 0 THEN
INSERT INTO t(b,c) values (inb, inc);
END IF ;
END;
DELIMITER ;
call p(2,30);
call p(3,30);
call p(4,30);
CSVファイル取り込み
例
mysql> load data infile 'e:/test.csv' into table t1 fields terminated by ',' enclosed by '"' lines terminated by '\r\n' (@var1,@var2) set b = cast(@var1 as signed), a = cast(@var2 as signed);
注意点
CSVファイルのデータに「"", ""」のようにカンマの後にスペースがあるとうまく動かない」
ダンプ出力
mysqldumpだとストアドが標準では出力されない。-Rオプションを付与する必要がある。
mysqldump
/*!50001 DROP TABLE `v_company_info_list`*/;
これはMySQL5.0.00.1以上のバージョンでのみ対応していること
mysqldumpの読み込みでエラー
ERROR 1227 (42000) at line <行数>: Access denied; you need the SUPER privilege for this operation
/*!50013 DEFINER=`ユーザー名`@`%` SQL SECURITY DEFINER */
SECURITY DEFINERは作成したユーザの権限で実行するらしい
要はSUPER権限を付与する必要があるということか?
update user set super_priv='Y' where user='';
上記コマンド実施後、MySQLを再起動したら動いた。
参考URL
文字コードの確認
show variables like 'character_set%';
show create database ***;
文字コードの変更
alter database *** character set cp932
新規データ登録
package sijo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Random;
import java.util.logging.Logger;
public class DataInsert {
private static final Logger LOGGER = Logger.getLogger("DataImport");
/**
* @param args
* @throws Exception
*/
public static void main(final String[] args) {
final long start = System.currentTimeMillis();
new DataInsert().execute();
final long end = System.currentTimeMillis();
LOGGER.info("処理時間(秒):" + (end - start) / 1000);
}
/**
* データ登録実行処理
*/
public void execute() {
try {
connectionManager(connection());
} catch(SQLException e){
LOGGER.severe("異常発生");
}
}
/**
* DBとのコネクション作成処理
* MySQL専用。バッチ処理対応
* @return
* @throws SQLException
*/
private Connection connection() throws SQLException {
final String [[JDBC]]_URL = "jdbc:mysql://localhost/db";
final String JDBC_USER = "user";
final String JDBC_PASS = "password";
try {
return DriverManager.getConnection(JDBC_URL
+ "?rewriteBatchedStatements=true", JDBC_USER, JDBC_PASS);
} catch (SQLException e) {
LOGGER.severe("DBとのコネクションに失敗:" + e);
throw new SQLException();
}
}
/**
* コネクション管理処理。
* 作成済みのコネクションを使用して、ステートメントの作成、コネクションの解放を行う。
* @param conn
* @throws SQLException
*/
private void connectionManager(final Connection conn) throws SQLException {
try{
conn.setAutoCommit(false);
final PreparedStatement pstmt = conn.prepareStatement(getSql());
executeSql(conn, pstmt);
}catch(SQLException e){
LOGGER.severe("SQL文の実行でエラー:" + e);
throw new SQLException();
}finally{
conn.close();
}
}
/**
* データ登録管理処理
* 作成済みのステートメントに値をセットし、データ登録する。
* 登録する件数や、コミットするタイミングを設定する。
* @param conn
* @param pstmt
* @throws SQLException
*/
private void executeSql(final Connection conn, final PreparedStatement pstmt)throws SQLException{
// 登録するデータ件数
final int COUNT = 100000;
//コミットするタイミング。COMMIT_SIZE件数毎にコミットする
final int COMMIT_SIZE = 10000;
//一度に登録する件数。バッチ処理
final int BATCH_SIZE = 500;
System.out.println(COUNT / COMMIT_SIZE + "回登録します");
for (int i = 1; i <= COUNT; i += BATCH_SIZE) {
executeBatch(pstmt, i, BATCH_SIZE);
if ((i + BATCH_SIZE - 1) % COMMIT_SIZE == 0) {
conn.commit();
System.out.print("*");
}
}
conn.commit();
}
/**
* INSERT文を設定。
* オーバーライドして使用する。
* @return
*/
String getSql(){
return "insert into table (a) values (?)";
}
/**
* バッチ実行処理。
* 登録する値をセットする。
* オーバーライドして使用する。
* @param pstmt
* @param i ユニークNoのセットのためのループカウント
* @param BATCH_SIZE
* @throws SQLException
*/
void executeBatch(final PreparedStatement pstmt,final int i,final int BATCH_SIZE) throws SQLException{
pstmt.clearBatch();
Random rand = new Random();
for (int j = 0; j < BATCH_SIZE; j++) {
pstmt.setObject(1, i + j); //発注番号
pstmt.addBatch();
}
pstmt.executeBatch();
}
}
データ移行
サービスの登録
C:\usr\mysql\bin>mysqld-nt.exe --install
最終更新:2014年07月15日 15:45