2012/05/29

[rails]ActiveRecordのソート

ActiveRecordには、ソートに関するメソッドが3つあります。

  • order
  • reorder
  • reverse_order

order

指定した文字列、もしくはシンボルでソートします。


Sample.order(:created_at)                 #=> ORDER BY created_at
Sample.order("created_at")                #=> ORDER BY created_at
Sample.order("created_at ASC, name DESC") #=> ORDER BY created_at ASC, name DESC

reorder

デフォルトスコープで指定したソート順を上書きし、reorderで指定したソート条件を適用します。


class Post < ActiveRecord::Base
  ..
  ..
  has_many :comments, :order => 'posted_at DESC'
end
 
Post.find(10).comments.reorder('name')

reverse_order

指定したソートの昇順・降順を入れ替えてソートします。 (以前こっちに書きましたが・・)


Sample.order(:created_at).reverse_order #=> ORDER BY created_at DESC

別段これは!ということは書いていませんが、reorderの存在を最近知ったので、 ちょっとまとめてみました。

そういえば、第4版が出ていましたね。

2013/11/01 追記。
Rails4におけるソートの新機能について、Rails4からActiveRecordのorderにハッシュを渡せるようなった。に書きました。

opensslで性能測定

opensslを誤解していて、鍵生成ツールだとばかり思っていたのですが、 実は様々なサブコマンドが用意されていて、性能測定までできてしまうことを今日知りました。

いつものように、

$ openssl --help
とやると、次のようなエラーメッセージが表示されます。
$ openssl --help
openssl:Error: '--help' is an invalid command.

Standard commands
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh                
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
gendh             gendsa            genpkey           genrsa            
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              req               
rsa               rsautl            s_client          s_server          
s_time            sess_id           smime             speed             
spkac             srp               ts                verify            
version           x509              

Message Digest commands (see the `dgst' command for more details)
md4               md5               rmd160            sha               
sha1              

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              rc2               
rc2-40-cbc        rc2-64-cbc        rc2-cbc           rc2-cfb           
rc2-ecb           rc2-ofb           rc4               rc4-40            
seed              seed-cbc          seed-cfb          seed-ecb          
seed-ofb          zlib              

-hや、--helpはサポートしてないけど、たくさんのサブコマンドを備えていることがわかります。 そこで気になったのが、「speed」と「s_time」というサブコマンド。 ヴァージョンの違いなどがあると思うので、詳しくはmanを参照していただきたいのですが、
  • speed Algorithm Speed Measurement.
  • s_time SSL Connection Timer.
って(僕のubuntuは)出力します。

で、使ってみました。

speed

speedサブコマンドは、暗号化アルゴリズムごとの処理速度を計測してレポートしてくれるコマンドです。 この結果を利用して何ができるかというと、例えばHTTPサーバにおいて、HTTPS接続をサポートする際に、 サーバで受け付けるSSLの暗号化方式のリストに反映するなどがあります。

s_time

s_timeサブコマンドは、SSLコネクションの接続速度を計測しレポートしてくれるコマンドです。 このコマンドでは、新規に接続する場合と、同一セッションで最接続する場合の速度を計測してくれます。 ですんで、サーバ側のSSLキャッシュの有効性などを検証することが可能です。

OpenSSL、もっと勉強しないと・・・(自戒)

2012/05/22

[mysql]テーブルスキャンを避ける方法

mysqlのドキュメントに「6.2.15 テーブルスキャンを避ける方法」っていうのがある。
一部コピペになるけれど、自分の理解のために書いてみる。

MySQLがあるクエリを実行する際に、テーブルスキャン(=フルスキャン)をするかどうかは、
EXPLAINを使うとわかる。EXPLAINの結果、
+----+-------------+------------+-------+・・・
| id | select_type | table      | type  |・・・
+----+-------------+------------+-------+・・・
|  1 | SIMPLE      | xxxxx      | const |・・・
|  1 | SIMPLE      | xxxxx      | ALL   |・・・
|  1 | SIMPLE      | xxxxx      | ALL   |・・・
+----+-------------+------------+-------+・・・
のように、type列が"ALL"になっているテーブルは、フルスキャンが実行され、パフォーマンスが劣化する場合がある。 typeがALLになる条件のは、
  • テーブルが小さい。
  • (INDEXを張っていても)WHERE句でINDEXを使用するに至らない。
  • (INDEXを張っていても)WHERE句でINDEXをキーとして除外する行数が小さい。
といった時になりそう(誤解してなければ・・)。 というわけで、まずは、適切にインデックスを張る、ことが最初の一歩だと確信している。