-->
ラベル mysql の投稿を表示しています。 すべての投稿を表示
ラベル mysql の投稿を表示しています。 すべての投稿を表示

2011-08-08

LIMIT付きのSELECT文の行数

参考URL。
http://www.postgresql.org/docs/8.4/static/tutorial-window.html
http://www.postgresql.jp/document/8.4/html/tutorial-window.html
http://hibari.2ch.net/test/read.cgi/db/1294641578/401-497

PostgreSQL。
$ eix postgresql-server -cI
[I] dev-db/postgresql-server (9.0.4-r1(9.0)@2011年07月04日): PostgreSQL server

user=# CREATE TABLE test001 (id SERIAL, data TEXT);
NOTICE:  CREATE TABLEはシリアル列"test001.id"用に暗黙的なシーケンス"test001_id_seq"を作成します。
CREATE TABLE
user=# INSERT INTO test001 (data) VALUES ('aaa');
INSERT 0 1
user=# INSERT INTO test001 (data) VALUES ('bbb');
INSERT 0 1
user=# INSERT INTO test001 (data) VALUES ('ccc');
INSERT 0 1
user=# SELECT * FROM test001 ORDER BY id DESC;
 id | data
----+------
  3 | ccc
  2 | bbb
  1 | aaa
(3 行)

user=# SELECT COUNT(*) AS cntall FROM test001;
 cntall
--------
      3
(1 行)

user=# SELECT *,COUNT(*) OVER() AS cntall FROM test001 ORDER BY id DESC LIMIT 1;
 id | data | cntall
----+------+--------
  3 | ccc  |      3
(1 行)

user=#

MySQL。
$ eix -e dev-db/mysql -cI
[I] dev-db/mysql (5.1.56@2011年05月09日): A fast, multi-threaded, multi-user SQL database server.

mysql> CREATE TABLE test001 (id SERIAL, data TEXT);
Query OK, 0 rows affected (0.23 sec)

mysql> INSERT INTO test001 (data) VALUES ('aaa');
Query OK, 1 row affected (0.93 sec)

mysql> INSERT INTO test001 (data) VALUES ('bbb');
Query OK, 1 row affected (0.15 sec)

mysql> INSERT INTO test001 (data) VALUES ('ccc');
Query OK, 1 row affected (0.14 sec)

mysql> SELECT * FROM test001 ORDER BY id DESC;
+----+------+
| id | data |
+----+------+
|  3 | ccc  |
|  2 | bbb  |
|  1 | aaa  |
+----+------+
3 rows in set (0.00 sec)

mysql> SELECT COUNT(*) AS cntall FROM test001;
+--------+
| cntall |
+--------+
|      3 |
+--------+
1 row in set (0.00 sec)

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM test001 ORDER BY id DESC LIMIT 1;
+----+------+
| id | data |
+----+------+
|  3 | ccc  |
+----+------+
1 row in set (0.00 sec)

mysql> SELECT FOUND_ROWS() AS cntall;
+--------+
| cntall |
+--------+
|      3 |
+--------+
1 row in set (0.00 sec)

mysql>

2010-07-11

my.cnfの追記の例

[mysql]
デフォルトの文字コード
default-character-set=utf8
タブで入力の補完。ディストリによってはデフォルト (mysql -u xxx --no-auto-rehash で確認)
auto-rehash

[mysqld]
デフォルトの文字コード
default-character-set=utf8
必ずutf8のデータが来る場合。こないとバックアップ、リストア時に悲惨かもしれない。
SELECT CHAR_LENGTH('全角の文字'); がおかしいが気にしない場合 default-character-set=binary をいろんな[xxx]に書いとけば良い。文字列関連がおかしくてもいいのであれば早くなるかもしれない。
skip-character-set-client-handshake
例えばもし5.0.xxの低いバージョンから5.0.xxの高いバージョンにアップしてリストアできなくなり、実はlatin1のテーブルにutf8,sjis,eucjpなどのlatin1以外を入れていたぜ、ということであれば、該当する低いバージョンのソースかrpmなどを探して他のどこかにインストールしてリストアして成功して再度binary指定でバックアップして、などやれば助かるかもしれません。
例えば、
show create table tablename;
 CREATE TABLE `tablename` ... CHARSET=latin1
であれば特に文字コードについてマニュアルを読むべきです。
latin1は特殊な値ではなく文字コードなので、例えばsjisをeuc-jpとして扱うと文字化けするのと同じようなミスです。
関係ないですが
http://www.php.net/manual/ja/function.mysql-set-charset.php
注意: 文字セットを変更するにはこの方法を使うことを推奨します。 mysql_query() で SET NAMES .. を実行する方法はお勧めできません。
どこかでsjisのバックスラッシュに関するドライバの設定云々と読んだような気がします。
//mysql_query("set names xxx");
mysql_set_charset("xxx");

/var/lib/mysqlのディレクトリを変更
datadir = /mnt/share/mysql
CREATE TABLE ... ENGINE=InnoDB ... 指定無しのデフォルト値
default_table_type = innodb
datadirのbinlogを10日後に消す
expire_logs_days = 10

接続数
max_connections = 80
管理(rootなど)用に残す
max_user_connections = 72
mysqlの中のプロセスの作成が再利用される。
thread_cache_size = 32
普通のアプリのタイムアウト。バッチ処理の場合に伸ばす。SET wait_timeout=86400;SET GLOBAL と書くと変えられる場合は戻さないとずっとそのままです。
wait_timeout = 30
SQL文の長さのMAX
net_buffer_length = 16K

myisam用の重要な値。msqyl専用のmyisam専用のサーバーの場合 5~9割
key_buffer_size = 128M
テーブルごとのfopenの保存する数。1024以上の場合制限解除(/etc/security/limits.conf). 1ユーザー1テーブルとかの場合、リリース後であれば祈る。
table_cache = 256
たぶんmyisamのselect専用のキャッシュ
query_cache_size = 32M

index無しソート
sort_buffer_size = 8M
myisam用?
myisam_sort_buffer_size = 8M
ランダムリード
read_rnd_buffer_size = 4M
連続リード
read_buffer_size = 4M
index無しjoin
join_buffer_size = 2M

内部データ。エラーがログに出る。増やす。出る。増やす。
innodb_additional_mem_pool_size = 16M
重要な値。msqyl専用のinnodb専用のサーバーの場合 5~9割
innodb_buffer_pool_size = 2048M
テーブルのファイルばらばら。管理の利点、サイズ増えすぎない。
innodb_file_per_table = true
commit時にディスク書き込み
innodb_flush_log_at_trx_commit = 1
バッファリングの重複をoff
innodb_flush_method = O_DIRECT
ログのメモリ
innodb_log_buffer_size = 16M
ログのファイル (/var/lib/mysql/ib_logfile0,1)バージョンによって変更後にリスタートでエラーor変化しない。変化させたい場合は消してからリスタート。
innodb_log_file_size = 64M
ログのファイル数 (/var/lib/mysql/ib_logfile0,1)
innodb_log_files_in_group = 2

手順
http://dsas.blog.klab.org/archives/50860867.html
mymemcheck を鵜呑みにする。
http://linux.mini13i.gotdns.org/?MySQL%2F%BA%C7%C5%AC%B2%BD%2F%A5%B5%A1%BC%A5%D0%A5%D1%A5%E9%A5%E1%A5%BF
他にも沢山解説サイトがあるので読む。
http://dev.mysql.com/doc/refman/4.1/ja/innodb-start.html
そして上記などの公式サイトの説明を読む。
$ mysqladmin variables
未設定時のデフォルト値がわからないので見る。
mysqlクラスターには関係ない。

2010-01-10

mysqlの接続数

この記事は mysql の max_connections を300以上にする場合に、良い効果があるかもしれない設定の例です。

$ diff /etc/security/limits.conf.2010-01-10 /etc/security/limits.conf
52a53,54
> mysql soft stack 256
> mysql hard stack 256

確認のため再起動します。
$ mysqladmin -uroot debug

ログを確認します。
$ sudo grep -i stack /var/log/mysql/*
/var/log/mysql/mysqld.err:Running threads: 1  Stack size: 262144

接続数2000を上限として512KBにしておけば、確認しなくても大体安全です。

http://dev.mysql.com/doc/refman/5.1/ja/source-notes-linux.html
http://www.hirohama.biz/mysql/mt-search.cgi?IncludeBlogs=1&search=mysqladmin