アットウィキロゴ

MySQL

チューニング

キャッシュを使わない

SELECT SQL_NO_CACHE ~

インデックス情報の確認

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は作成したユーザの権限で実行するらしい

MySQLのマニュアルに以下のようにかいてあった
http://dev.mysql.com/doc/refman/5.1/ja/create-view.html
DEFINER節を規定する場合、SUPER権限を持っていない限り、ユーザの値を除くいかなるアカウントにも値を設定することはできません。

要は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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。