16. 全文検索
SELECT DISTINCT `reservations`.`id`
FROM `reservations`
LEFT OUTER JOIN `customers`
ON `customers`.`id` = `reservations`.`customer_id`
LEFT OUTER JOIN `customer_phones`
ON `customer_phones`.`customer_id` = `customers`.`id`
LEFT OUTER JOIN `customer_emails`
ON `customer_emails`.`customer_id` = `customers`.`id`
WHERE `reservations`.`restaurant_id` = XXXX AND (
concat(customers.last_name, customers.first_name) like '%さの%' OR
concat(customers.last_name_reading,customers.first_name_reading) like '%さの%' OR
customers.company_name like '%さの%' OR
customers.note like '%さの%' OR
reservations.note like '%さの%' OR
customer_emails.email like '%さの%' OR
) ORDER BY `reservations`.`start_at` DESC LIMIT 10 OFFSET 0;
• Likeの部分一致検索
18. カジュアルな話:なぜ部分一致検索は遅くなりがちか
• ここで試しに本当にカジュアルな話も挟んでみます…
• select * from t where col like ‘%word%’
• 理由:インデックスが効かないから
• Indexing LIKE Filters
• http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-
tuning
• インデックスとは索引。つまりそのままの意味。
• 前方一致のみインデックスが効く。
19. Likeフィルタで発生した事案
• select * from t where col like ’{POST_DATA}%’
• 空のPOST_DATA
• select * from t where col like ’%’
• DBマスタのCPUが100%になってしまった
• バリデーション漏れ