http://ya-ko.vox.com/library/post/%E3%82%B9%E3%82%A4%E3%82%AB%E5%89%B2%E3%82%8A%E3%81%97%E3%81%9F%E3%81%84.htmlhttp://www.amazon.co.jp/%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%ABWeb%E3%82%B5%E3%82%A4%E3%83%88-Cal-Henderson/dp/4873113113?p=12 みたいなURLになりますが 、[オプション]の[バーマリンク設定](表記は日本語版の場合です)で変更できます。

.htaccess に
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/ku/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/ku/index.php [L]
</IfModule>
という rewrite rule が追加されます。
wp_postテーブルwp_postsテーブルに保存されていて、エントリのタイトルはpost_titleに、スラッグはpost_nameに保存されています。
スラッグを明示的に設定しないときには、エントリのタイトルがスラッグに設定されるようになっています。
http://labs.gmo.jp/blog/ku/2007/07/06/wordpress-slug-implementation という形式でリクエストがくるとWordPressは
SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND YEAR(post_date)='2007' AND MONTH(post_date)='7' AND DAYOFMONTH(post_date)='5' AND post_name = 'wordpress-slug-implementation' AND (post_type = 'post') ORDER BY post_date DESCこんなSQLを発行しています。post_nameがURLに入っているタイトルと一致するエントリを探しています。
実際にどのインデックスが使われているかEXPLAINで見てみましょう。
+----+-------------+----------+------+-----------------------------------------+-----------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+-----------------------------------------+-----------+---------+-------+------+-----------------------------+
| 1 | SIMPLE | wp_posts | ref | post_name,type_status_date,post_related | post_name | 202 | const | 3 | Using where; Using filesort |
+----+-------------+----------+------+-----------------------------------------+-----------+---------+-------+------+-----------------------------+
post_nameのインデックスをキーとしてエントリを探していることが分かります。
wordpress-slug-implementation-2というふうに、最後に数字がついていきます。
この方法だと、今度は何番目まで使ったのかが分からない問題が出てきます。同じタイトルでたくさん投稿されたときに、最後につける数字をいくつにすればいいのかを調べる必要があります。WordPressではテーブルをみる限り、その数字をどこかに保存していたりはしないので、エントリのタイトルが重複するたびに、スラッグにつける数字を1ずつ増やしてテーブルをSELECTして既に使われていないかどうかを調べて、使われていない番号まで探しているのだと予想されます。
wordpress-slug-implementation
wordpress-slug-implementation-1
wordpress-slug-implementation-2
wordpress-slug-implementation-3
の3つのURLが割り当てられます。これを常に最後にエントリIDをつけることにすると(ひとつめのエントリのIDを244としています)
wordpress-slug-implementation-244
wordpress-slug-implementation-245
wordpress-slug-implementation-246
wordpress-slug-implementation-247
のようになります。
こうすると、エントリのURLを決めるときに重複しているかどうかを調べる必要がなくなります。URLの最後にはuniqueになっているのがわかっているエントリIDがついているので、URLが重複することはありません。
さらにいいことに、まじめにスラッグ部分のインデックスをつくって検索する、ということをする必要がなくなります。URLの最後の部分にエントリIDが入っていることが分かっているので、URLの最後の部分を正規表現等で取り出せばはじめからインデックスが張られているエントリIDで検索することができます。スラッグのインデックスを張らなくてよくなったぶん、ディスクスペースを節約できますし(結果としてメモリの消費量が減ってキャッシュのヒット率も上がりそうです)、インデックスの更新がいらなくなる分、無視できる程度でしょうけれどCPUやディスクIOの節約にもなります。
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/140
comments