サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ドラクエ3
www.tree-tips.com
大量レコードのjoinは遅い 遅くなるのはMySQLだけなの? そんなことはありません。MySQLもPostgresもOracleもSQLServerも遅くなります。 Oracleのオプティマイザは賢いですが、基本的に大量レコードのjoinは避けるべきです。 何故遅くなるの? データ量が多すぎてテンポラリ領域を使う(バッファに乗り気らない)から、です。 何件くらいからjoinが遅くなるの? スキーマ構造によるので一概には言えませんが、大体1000件辺りから微妙に遅くなり、1万件を超えると一気に遅くなります。 1万件程度なら割と力技(マシンパワー)で何とかなるので、1万件を超えた辺りから注意してみて下さい。 よくある例では、ログを元にしたアクセスレポートの生成時に、大量レコードのjoinが必要になり易いかもしれませんね。 解決策 データ量を減らしてからjoinする。 データ量が多いならデータ
外部キーでデッドロックを起こすサンプルコード。 drop table if exists child; create table child (id int, pid int, primary key (id, pid))engine=innodb; drop table if exists parent; create table parent (id int, count int, primary key (id))engine=innodb; insert into parent values (1, 0); alter table child add foreign key (id) references parent (id); トランザクションA ------------------------------------- begin; insert into child val
MySQLでgroup byした結果をカウントする テスト用テーブル +--------------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------------+--------------+------+-----+---------+-------+ | pref_cd | char(2) | NO | PRI | | | | pref_name | text | YES | | NULL | | | city_cd | char(5) | NO | PRI | | | | city_name | text | YES | | NULL | | | town_street_cd
トランザクション分離レベルの種類 ANSI/ISO SQLでは、以下のように定義されています。 ロストアップデートについては特に策定されていないと思いますが、一覧に加えておきます。 分離レベル 性能 ダーティーリード ファジーリード ファントムリード ロストアップデート read uncommitted 高 起きる。 起きる。 起きる。 起きる。 read committed | 起きない。 起きる。 起きる。 起きる。 repeatable read | 起きない。 起きない。 起きる。 起きる。 serializable 低 起きない。 起きない。 起きない。 起きない。 ただし、ANSI/ISO SQLはあくまで仕様であって、実装・動作は各データベース毎に異なります。 MySQLの場合は以下のようになります。 分離レベル 性能 ダーティーリード ファジーリード ファントムリード ロス
形態素解析による検索とは? 形態素・同義語の辞書のメンテナンスをする前に、形態素解析による検索について軽く解説します。 検索対象の文字列 文字列1「私はjavascriptというプログラミング言語が得意です!」 文字列2「私はjavaというプログラミング言語が大嫌いです・・・」 RDBで検索する場合 検索ワード「java」をRDBで検索すると、以下のようになります。 select * from hoge where freeword like '%java%'; 文字列1・・・ヒットする。 文字列2・・・ヒットする。 likeは中間一致検索であるため、文字列1・2共にヒットしてしまいます。 文章に対して完全一致検索をしてもほぼ検索にヒットしないので、通常中間一致検索をします。 しかしこの場合、javaを検索したいのであって、javascriptをヒットさせたくありません。 こういう状態を「
基礎 まずはsolrの事を知りましょう! solrを使う前に知っておくべき事 solrの利用事例 形態素解析器の種類 solrの環境設定をしましょう! solrのインストール solrの設計をしましょう! solrのフィールド設計 インデックス生成・検索のサンプルコードを書きましょう! solrjでインデックス生成・検索 solrjでランダムソートする solrの管理画面を使ってみましょう! solr adminでデータ確認 solrの辞書機能を使ってみましょう! solrの同義語の設定 solrの日本語形態素解析の設定 応用 solrで実用的なインデクサを実装しましょう! solrjで独自のインデクサを実装する solrで実用的なサーチャーを実装して色々な検索をしましょう! solrjでfacet field検索 solrjでfacet query検索 kuromojiで漢字からカタカナ
solrって何? Apache solr solr wiki オープンソースのpure javaの全文検索エンジンです。 Apacheのトッププロジェクトであり、twitterやfacebook級のサイトでも使用されています。 solrにできる事は? 超高速検索のエンジンを自分で作成可能(オレオレMySQLのようなものを作る事ができる)。 検索する項目を自分で定義可能(RDBのカラム)。 定義した項目に、順序を保持したままリスト形式で値を保存可能(カラムにjavaでいうところのListを保存できる)。 完全一致検索可能。 中間一致検索可能(フルスキャンで超低速になるので非推奨)。 前方一致検索可能。 超高速に件数を取得する、ファセット検索が可能。(select count(*)を100回同時に行なっても超高速) 超高速に同義語検索可能で、同義語の辞書を自分で定義可能。(or name =
solrのレプリケーション レプリケーションとは、複数のサーバでデータを同期することを言います。 solrのレプリケーションには2通りの方法があります。 solr1.3までのバージョンではssh + rsyncによるレプリケーションが行えます。 solr1.4以降ではReplicationHandlerでhttp通信によるレプリケーションが可能になりました。 ReplicationHandlerはhttp通信なので、ssh+rsync形式と違ってdaemonの起動も不要でportを開ける必要もありません。 solr1.4以降ではReplicationHandlerを使う事をおすすめします。 なお、ReplicationHandlerを行うにはcommons-httpClientが必要なので、jarを追加しましょう。 レプリケーションの設定をする レプリケーションの設定はsolrconfig
elasticsearch version0.20.6の設定 elasticsearchの設定ファイルです。 solrで言うところのsolrconfig.xmlに当たります。 では早速 /usr/local/elasticsearch/config/elasticsearch.yml を見ていきます。 solrconfig.xmlより少ないとはいえ、それなりの量なので軽く流し見しましょう。 elasticsearch.yml ##################### ElasticSearch Configuration Example ##################### # This file contains an overview of various configuration settings, # targeted at operations staff. Appli
関連記事 solrの同義語の設定 kuromojiの辞書のメンテナンス 形態素解析器の種類 初期設定の状態で検索し、問題点を探る。 まずはanalysis画面で、形態素解析のユーザ定義辞書未設定の状態で検索してましょう。 初期設定のschema.xmlに日本語形態素解析を設定した「text_ja」があるので、typeに「text_ja」を指定します。 「宇治抹茶ケーキ」で検索したのですが、この文章にヒットしました。この結果、どう思いますか? ユーザ視点では「宇治抹茶ケーキ」を探しているのであって、分割された単語を含むページが見たい訳ではないのです。 この状態は検索の精度が低いと言えると思います。 よほど困っているユーザでない限り、必要な情報を頑張って探してくれないので、コンバージョンも下がり、売上も比例して下がるでしょう。 ユーザ定義辞書を設定する。 kuromojiの形態素解析辞書は、j
bashのmailコマンドでメール送信 何故mailコマンドを使うのか mailコマンドを使う理由は単純明快です。OSの標準コマンドだからです。 標準である事は非常に重要です。 プログラマであれば、普段使い慣れたjava・perl・ruby等、共通化や生産性の観点からそれらで実装したくなります。 それらで実装する事は簡単ですが、デプロイは?言語・モジュールはインストールされている?という問題があります。 必須ではないがちょっとメール送信したい、という小物的なスクリプトになりがちなメール送信ではそれらが問題になり易いです。 そんな時に頼りになるのがOS標準であるmailコマンドです。これなら安心できるので、関数化して簡単に扱えるよう実装しましょう。 mailコマンドでメール送信するサンプルコード #!/bin/sh #=====================================
expectコマンドで対話式パスワード認証を突破するためのスクリプト 自動ログイン用の汎用シェルスクリプトを作成 #!/bin/sh auto_ssh() { host=$1 id=$2 pass=$3 expect -c " set timeout 10 spawn ssh ${id}@${host} expect \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\n\" expect \"${id}@${host}'s password:\" send \"${pass}\n\" } \"${id}@${host}'s password:\" { send \"${pass}\n\" } interact " } 例えばこれを「auto_login.sh」というファイル名で保存しておきます。
mysqldumpのオンラインバックアップ mysqldumpのオプション mysqldump時にロックをかけないオプションは「--single-transaction」です。 --single-transaction このオプションはサーバからデータをダンプする前にBEGIN SQLステートメントを発行します。InnoDBといったトランザクションテーブルに対してのみ便利です。なぜなら、アプリケーションをブロックせずに、BEGINが発行された当時のデータベースの状態をダンプするからです。 このオプションを使用しているときは、一定の状態でダンプされるのはInnoDBテーブルのみだということを留意してください。例えば、このオプションを使用中にダンプされたMyISAMやMEMORYテーブルは状態が変化する可能性があります。 mysqldump — データベースバックアッププログラム リファレンス
-eオプションでSQLを実行する。 mysql -uroot -e "show tables" -eオプションはトランザクションに注意。 以下はトランザクションは効いていません。 mysql -uroot -e "begin;" date mysql -uroot -e "insert into hoge values(1, 2, 3);" date mysql -uroot -e "commit;" トランザクションが効かない理由は簡単です。 mysqlコマンド毎にコネクションが切れているからです。 従って、-eオプションでトランザクションを有効にするには、以下のようにワンライナーにするしかありません。 mysql -uroot -e "begin; insert into hoge values(1, 2, 3); commit;" bashの変数をSQLに埋め込む事も可能です。以下は
Waiting for table metadata lockって何? 8.10.4. Metadata Locking Within Transactions 日本語ページにこの説明は無いので、頑張って翻訳してみます。 To ensure transaction serializability, the server must not permit one session to perform a data definition language (DDL) statement on a table that is used in an uncompleted transaction in another session. トランザクションの直列化を確保するため、他セッションによる処理が完了するまでの間、DDLの実行は許可しません。 As of MySQL 5.5.3, the serv
このページを最初にブックマークしてみませんか?
『tree-tips: 主にsolr・MySQLのtipsを掲載しています』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く