サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
アメリカ大統領選
www.tree-tips.com
よくあるdumpのリストア まずはリモートサーバ側でdumpを出力します。 mysqldump --single-transaction -uuser -ppassword schema > /tmp/dump.sql ローカル側でdump.sqlをscpで取得し、リストアします。 scp ./dump.sql user@host:/tmp mysql -uuser -ppassword schema < /tmp/dump.sql 場合によってはリモートサーバでgzipするかもしれませんね。 問題点 これだとdump.sqlのファイル出力と、scpが必要になります。 dumpしたsqlのファイルサイズが10G程度になると、無駄なIOが発生して時間がかかります。 場合によっては「ディスク容量がギリギリ足りない!!」なんていう状況もあるでしょう。 ではこのIOを極力減らしてみます。 ファイル
noindexについて noindexとは? クローラに「このページはインデックス化しないでね」というヒントを与えます。 あくまでヒントなので、適用するかどうかはクローラが決定します。 重要なヒントなので基本的に適用されますが、行儀の悪いクローラは無視するかもしれません。 また、検索エンジン以外の目的でクロールするクローラも無視する可能性があります。 単にnoindex機能未対応のクローラも同様でしょう。 使い方 headタグ内にmetaタグを記述します。 <meta name="robots" content="noindex" /> どういう時に使えばいい? 主に以下がnoindexの使い所かと思います。 管理画面 確認・完了画面 開発者用のデバッグページ 個人情報が絡む確認・終了画面には必須です。個人情報がインデックス化されると最悪の事態を招くでしょう。 よくある間違い noinde
creatorとは? creator.diconに、デフォルトで沢山creatorクラスが登録されています。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="convention.dicon"/> <include path="customizer.dicon"/> <component name="interceptorCreator" class="org.seasar.framework.container.creator.InterceptorCreator"/> <compon
mysqldumpのオンラインバックアップ mysqldumpのオプション mysqldump時にロックをかけないオプションは「--single-transaction」です。 --single-transaction このオプションはサーバからデータをダンプする前にBEGIN SQLステートメントを発行します。InnoDBといったトランザクションテーブルに対してのみ便利です。なぜなら、アプリケーションをブロックせずに、BEGINが発行された当時のデータベースの状態をダンプするからです。 このオプションを使用しているときは、一定の状態でダンプされるのはInnoDBテーブルのみだということを留意してください。例えば、このオプションを使用中にダンプされたMyISAMやMEMORYテーブルは状態が変化する可能性があります。 mysqldump — データベースバックアッププログラム リファレンス
MySQLの後方一致検索 インデックスを設定せずに後方一致検索してみる 住所が「三丁目」で終わるデータの件数をカウントしてみます。 まずはインデックスを設定せずに後方一致検索します。 mysql> select count(*) from address where town_street_name like '%三丁目'; +----------+ | count(*) | +----------+ | 12263 | +----------+ 1 row in set (0.29 sec) mysql> explain select count(*) from address where town_street_name like '%三丁目'; +----+-------------+---------+------+---------------+------+---------+
大量レコードのjoinは遅い 遅くなるのはMySQLだけなの? そんなことはありません。MySQLもPostgresもOracleもSQLServerも遅くなります。 Oracleのオプティマイザは賢いですが、基本的に大量レコードのjoinは避けるべきです。 何故遅くなるの? データ量が多すぎてテンポラリ領域を使う(バッファに乗り気らない)から、です。 何件くらいからjoinが遅くなるの? スキーマ構造によるので一概には言えませんが、大体1000件辺りから微妙に遅くなり、1万件を超えると一気に遅くなります。 1万件程度なら割と力技(マシンパワー)で何とかなるので、1万件を超えた辺りから注意してみて下さい。 よくある例では、ログを元にしたアクセスレポートの生成時に、大量レコードのjoinが必要になり易いかもしれませんね。 解決策 データ量を減らしてからjoinする。 データ量が多いならデータ
基礎 まずは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で漢字からカタカナ
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
-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に埋め込む事も可能です。以下は
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のレプリケーション レプリケーションとは、複数のサーバでデータを同期することを言います。 solrのレプリケーションには2通りの方法があります。 solr1.3までのバージョンではssh + rsyncによるレプリケーションが行えます。 solr1.4以降ではReplicationHandlerでhttp通信によるレプリケーションが可能になりました。 ReplicationHandlerはhttp通信なので、ssh+rsync形式と違ってdaemonの起動も不要でportを開ける必要もありません。 solr1.4以降ではReplicationHandlerを使う事をおすすめします。 なお、ReplicationHandlerを行うにはcommons-httpClientが必要なので、jarを追加しましょう。 レプリケーションの設定をする レプリケーションの設定はsolrconfig
Spatial Searchの設定 Spatial Searchとは? Spatial Searchは、位置情報を使って空間検索する機能です。 緯度・経度を使って、中心点から半径Nkm以内で検索し、中心点から距離が近い順にソート、等が可能です。 Spatial Searchのためのschema.xmlの設定 必要な設定のみを抽出しました。 <schema name="address" version="1.5"> <types> <fieldType name="tdouble" class="solr.TrieDoubleField" sortMissingLast="true" precisionStep="8" positionIncrementGap="0"/> <fieldType name="location" class="solr.LatLonType" subFieldS
bashのmailコマンドでメール送信 何故mailコマンドを使うのか mailコマンドを使う理由は単純明快です。OSの標準コマンドだからです。 標準である事は非常に重要です。 プログラマであれば、普段使い慣れたjava・perl・ruby等、共通化や生産性の観点からそれらで実装したくなります。 それらで実装する事は簡単ですが、デプロイは?言語・モジュールはインストールされている?という問題があります。 必須ではないがちょっとメール送信したい、という小物的なスクリプトになりがちなメール送信ではそれらが問題になり易いです。 そんな時に頼りになるのがOS標準であるmailコマンドです。これなら安心できるので、関数化して簡単に扱えるよう実装しましょう。 mailコマンドでメール送信するサンプルコード #!/bin/sh #=====================================
dynamic fieldについて 通常のフィールド(以降、static fieldと呼びます)とdynamic fieldのどちらを使うか。 一番最初に検討するべき部分です。 まずは両者をよく知っておく必要があります。 static fieldとは? static fieldはsolrの標準のフィールドです。 static fieldの使い所 私は以下の3種類についてのみstatic fieldにしています。 uniqueKeyフィールド timestampフィールド _version_フィールド uniqueKeyフィールドは必ず1個必要なので、これは必然的にstatic fieldになります。 <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"
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」というファイル名で保存しておきます。
トランザクション分離レベルの種類 ANSI/ISO SQLでは、以下のように定義されています。 ロストアップデートについては特に策定されていないと思いますが、一覧に加えておきます。 分離レベル 性能 ダーティーリード ファジーリード ファントムリード ロストアップデート read uncommitted 高 起きる。 起きる。 起きる。 起きる。 read committed | 起きない。 起きる。 起きる。 起きる。 repeatable read | 起きない。 起きない。 起きる。 起きる。 serializable 低 起きない。 起きない。 起きない。 起きない。 ただし、ANSI/ISO SQLはあくまで仕様であって、実装・動作は各データベース毎に異なります。 MySQLの場合は以下のようになります。 分離レベル 性能 ダーティーリード ファジーリード ファントムリード ロス
関連記事 solrjでfacet field検索 solrjでfacet query検索 solrjでランダムソートする Data Import Request Handler Data Import Request Handler solrの標準機能で、xmlファイルやRDBからデータを取得し、インデクシングする機能です。 今回はData Import Request Handlerは使いません。 Data Import Request Handlerを使わない理由は以下の通りです。(DataSourceがRDBの場合) data-config.xmlに実装を書いてしまうので、IDEによるリファクタリング機能が効かない。 data-config.xmlの実装ルールを知っていないといけないので、実装できる人が限られる。 ORMによるタイプセーフな実装ができない。 data-config.x
形態素解析による検索とは? 形態素・同義語の辞書のメンテナンスをする前に、形態素解析による検索について軽く解説します。 検索対象の文字列 文字列1「私はjavascriptというプログラミング言語が得意です!」 文字列2「私はjavaというプログラミング言語が大嫌いです・・・」 RDBで検索する場合 検索ワード「java」をRDBで検索すると、以下のようになります。 select * from hoge where freeword like '%java%'; 文字列1・・・ヒットする。 文字列2・・・ヒットする。 likeは中間一致検索であるため、文字列1・2共にヒットしてしまいます。 文章に対して完全一致検索をしてもほぼ検索にヒットしないので、通常中間一致検索をします。 しかしこの場合、javaを検索したいのであって、javascriptをヒットさせたくありません。 こういう状態を「
solrって何? Apache solr solr wiki オープンソースのpure javaの全文検索エンジンです。 Apacheのトッププロジェクトであり、twitterやfacebook級のサイトでも使用されています。 solrにできる事は? 超高速検索のエンジンを自分で作成可能(オレオレMySQLのようなものを作る事ができる)。 検索する項目を自分で定義可能(RDBのカラム)。 定義した項目に、順序を保持したままリスト形式で値を保存可能(カラムにjavaでいうところのListを保存できる)。 完全一致検索可能。 中間一致検索可能(フルスキャンで超低速になるので非推奨)。 前方一致検索可能。 超高速に件数を取得する、ファセット検索が可能。(select count(*)を100回同時に行なっても超高速) 超高速に同義語検索可能で、同義語の辞書を自分で定義可能。(or name =
MySQLキャッシュヒット率計算ツール 一々excel等でMySQLのキャッシュヒット率を計算する事ってありますよね。 もうそんな無駄な作業はやめましょう。 コピペだけでMySQLのキャッシュヒット率を出力するツールを用意したのでぜひ使ってみて下さい! 【ステップ1】キャッシュに関する値を取得する。 mysqlクライアントで以下のSQLを実行して下さい。 show global status like 'QCache%'; -- ↓このテーブルごとコピーして下さい。 +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 67079328 |
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
外部キーでデッドロックを起こすサンプルコード。 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
インデックスデータを確認する。 開発時でも必要になりますが、リリース後の運用でも値の確認は非常に重要になりますね。 まず、インデックスデータと言っても2種類有る事を認識しておく必要があります。 1つ目は「stored」、2つ目は「indexed」、です。 storedの値は容易に確認できますが、indexedの値は非常に確認がし難いです。 その2つは何が違うのでしょう。storedは検索結果として返却される値で、indexedは検索時に使用される値です。 RDBと比較すると解りやすいので、以下をご覧下さい。 solr MySQL stored selectした結果 indexed Bツリーインデックスやユニークインデックスの値 いかがでしょうか。 indexedの値が確認し難いのですが、RDBはindexされた値は確認する事ができません。 理由は、RDBには基本的に形態素解析が無く常に指定
lock in share modeとは? lock in share modeは、共有ロック・shared lock・slock、と言われているロックです。 for updateは、排他ロック・xlock、と言われています。 参照(select)する時にロックをする機能です。 lock in share modeはどんな時に使う? 主な使い道は、ファジーリード・ロストアップデートを防ぐ、です。 ファジーリードはトランザクション分離レベルがread committed以下の場合の発生します。repeatable readの場合はそもそもANSI/ISO SQLの仕様上発生しません。 具体的な使い所としては、一覧画面の表示時のSQLや、不正データ検出、等で使うかと思います。 for updateとの違いは? 最大の違いはslockによる参照をブロックしない・されない点です。つまり、参照同士の
新着記事 日時 タイトル 概要 Wed Dec 17 01:00:00 UTC 2014 1126クリック guava Ordering Orderingはjavaの最強のソートライブラリではないでしょうか。Collections.sort()と違い、NullPointerExceptionを起こさなくする事もできます。今回はOrderingを使ってDTOのリストを自由自在にソートしてみましょう。 Sun Jul 13 03:10:00 UTC 2014 6395クリック MySQL ファイル出力無しでリモートでmysqldumpしてローカルにリストアする リモートにあるMySQLをmysqldumpでローカルにリストアしたい事ってありますね。この時リモートでdumpのsqlファイルを出力してからローカルにscpしてそれを取り込むと、余計に時間を食います。今回はファイル出力無しに直接リモー
関連記事 solrjでfacet field検索 solrjでfacet query検索 solrjで独自のインデクサを実装する solrjでランダムソートする 何故solrjを使うのか。 solrでインデックスを生成するには、xmlをpostするか、ファイルからxmlやjsonを読み込むか、DBから読み込む等の方法があります。 それらを簡単い行う事ができるAPIがsolrjです。かなり簡単にインデックス生成できます。 apache-solr-3.6.0.zipに含まれているので、すぐ試すことができます。 solrjでインデックス生成と検索する。 習うより慣れろ、という事でいきなりインデックス生成とインデックス検索のs2JUnitのテストケースです。 solrのインストールとsolrの日本語形態素解析の設定を済ませている事前提のコードです。 solrjのConcurrentUpdateSo
関連記事 solrの同義語の設定 kuromojiの辞書のメンテナンス 形態素解析器の種類 初期設定の状態で検索し、問題点を探る。 まずはanalysis画面で、形態素解析のユーザ定義辞書未設定の状態で検索してましょう。 初期設定のschema.xmlに日本語形態素解析を設定した「text_ja」があるので、typeに「text_ja」を指定します。 「宇治抹茶ケーキ」で検索したのですが、この文章にヒットしました。この結果、どう思いますか? ユーザ視点では「宇治抹茶ケーキ」を探しているのであって、分割された単語を含むページが見たい訳ではないのです。 この状態は検索の精度が低いと言えると思います。 よほど困っているユーザでない限り、必要な情報を頑張って探してくれないので、コンバージョンも下がり、売上も比例して下がるでしょう。 ユーザ定義辞書を設定する。 kuromojiの形態素解析辞書は、j
doltengをインストールする。 Seasarプロジェクトの作成方法ですが、eclipseプラグイン「dolteng」を利用すると簡単に作成可能です。 doltengのページに書かれたeclipse更新サイトからインストールします。 doltengでseasarプロジェクトの作成。 s2strutsやsastrutsはsolr adminと相性が悪い為、doltengで生成する際のプロジェクトは以下のようにします。 Application Typeが「Web Application」だが、Presentationを未選択にするのがポイント。 Persistenceは任意で構いません。Server ManagementはWTPにするとよいです。 続いてパスの設定ですが、任意で構いません。 solrをダウンロードする。 solrのオフィシャルサイトからsolrをダウンロードします。 Apac
このページを最初にブックマークしてみませんか?
『tree-tips: 主にsolr・MySQLのtipsを掲載しています』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く