1) PHP: select * from main left join t1 on t1.t1_id=main.t1_id left join t2.. left join t4.. where t1.t1_name like '%".$str."%' or t2.t2_name like '%".$str."%' ... использует индексы везде, кроме основной таблицы - там перебором. Не будет ли быстрее [sql]select * from main where t1_id in (select t1_id from t1...) or t2_id in ()[/sql] - тут по идее везде индексы? 2) Выбрать клиентов и к ним их последний заказ. Заказов может не быть, или быть более одного. Использую следующее извращение: PHP: select * from clients left join t1 t1a on clients.t1_id=t1a.t1_id left join t1 t1b on clients.t1_id=t1b.t1_id and t1b.date>t1a.date where ".$where." and t1b.t1_id is null Как лучше?
икспириментом я и сам могу )) щаз не доберусь громоздить тестовую базу нормального размера, может пока кто-то уже это делал. Тем более что в основном сейчас время на тесты есть на целероне под хп, а там от влияния звезд в три раза время легко плавает. вместо вложенных запросов можно попробовать "(select * from main, t1 where main.t1_id=t1.t1_id and t1.name like '%".$str."%') union (select * from main, t2..."
union=8.40349 left join=16.34716 при том, что все равно показывает что не использует индекс в основной таблице. Как должен выглядеть [sql]select main.* from main left join t1 on main.t1_id=t1.t1_id where t1.name like '%%'[/sql]?
хмм, нет, это я там намудрил с отключением части условий. a=union, b=left join a=8.58573 b=10.23514 a=8.97868 b=8.99736 a=7.43848 b=8.63145 добавляю еще одно хитрож* условие по мейну и t6 (where find_in_set(t6_id,main.t6_list) and t6.name like...). добавляю соотв. union и left join a=8.74031 b=15.5234 a=9.47412 b=16.78071 a=8.63061 b=17.85402 любопытно.
вопрос 3. select * from t1 where id in (select t1_id...) дает перебор по всему t1 и в цикле повтор вложенного запроса. как от этого уйти? сейчас под рукой только mysql4, может в пятом не так?
перебор по таблице где like - естественно. Происходит перебор по основной таблице. что касается вопроса 3, то там лайка нет вообще. Дело в конкретном запросе, но я пока от него вообще отказался, потом рассмотрим.
да нет, не совсем естественно. они [таблицы с like] подключаются по первичному ключу -- отсюда и индекс. посмотрите explain