Profic
just Profic (PHP5 BetaTeam)
Скорость и оптимизация запроса
Имеются таблицы:
>show create table t98;
CREATE TABLE `t98` (
`id` int(10) unsigned NOT NULL default '0',
`name_rus` varchar(255) NOT NULL default '',
`name_eng` varchar(255) NOT NULL default '',
`name_style` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `name_rus` (`name_rus`),
KEY `name_eng` (`name_eng`)
) TYPE=MyISAM
>show create table t37;
CREATE TABLE `t37` (
`id` int(10) unsigned NOT NULL default '0',
`iname` int(10) unsigned NOT NULL default '0',
`tname` int(10) unsigned NOT NULL default '0',
...
`pharmgroupatccode` varchar(255) NOT NULL default '',
...
PRIMARY KEY (`id`),
KEY `iname` (`iname`),
KEY `tname` (`tname`),
...
KEY `pharmgroupatccode` (`pharmgroupatccode`),
...
) TYPE=MyISAM
В t98 - 17130 записей, в t37 - 75416 записей.
Нужно выбрать записи из t98 по условиям из t37. Сейчас это делается примерно таким запросом:
SELECT DISTINCT t98.name_rus AS item, t98.id, t98.name_style FROM t98 LEFT JOIN t37 ON t98.id = t37.tname WHERE t37.pharmgroupatccode LIKE '.%' AND t98.name_rus <> '' ORDER BY name_rus ASC LIMIT 0,150
Это - основа запроса, реально идет 3 запроса (для составления алфавитного указателя, для подсчета кол-ва подходящих записей (для постраничного отображения) и собственно для данных), но условия у всех одинаковые.
Так вот на такие запросы тратиться непозволительно много времени (на алфавитный указатель и подсчет кол-ва записей по ~2 секунды, на саму выборку данных ~4 секунды). Есть ли у кого-нить идеи, как этот запрос можно изменить для уменьшения его времени выполнения? Мне ничего в голову не приходит
Для справки:
1) Вывод EXPLAIN для вышеуказанного запроса:
Мне он совсем не нравиться, но что можно сделать ума не приложу, я уж и с индексами наэксперементировался, а толку ноль
2) Платформа - Win32 (WinXP)
MySQL/3.23.49; PHP/4.3.0; Apache/2.0.44 (хотя последние два пункта работают нормально и от них нифига не зависит)
Имеются таблицы:
>show create table t98;
CREATE TABLE `t98` (
`id` int(10) unsigned NOT NULL default '0',
`name_rus` varchar(255) NOT NULL default '',
`name_eng` varchar(255) NOT NULL default '',
`name_style` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `name_rus` (`name_rus`),
KEY `name_eng` (`name_eng`)
) TYPE=MyISAM
>show create table t37;
CREATE TABLE `t37` (
`id` int(10) unsigned NOT NULL default '0',
`iname` int(10) unsigned NOT NULL default '0',
`tname` int(10) unsigned NOT NULL default '0',
...
`pharmgroupatccode` varchar(255) NOT NULL default '',
...
PRIMARY KEY (`id`),
KEY `iname` (`iname`),
KEY `tname` (`tname`),
...
KEY `pharmgroupatccode` (`pharmgroupatccode`),
...
) TYPE=MyISAM
В t98 - 17130 записей, в t37 - 75416 записей.
Нужно выбрать записи из t98 по условиям из t37. Сейчас это делается примерно таким запросом:
SELECT DISTINCT t98.name_rus AS item, t98.id, t98.name_style FROM t98 LEFT JOIN t37 ON t98.id = t37.tname WHERE t37.pharmgroupatccode LIKE '.%' AND t98.name_rus <> '' ORDER BY name_rus ASC LIMIT 0,150
Это - основа запроса, реально идет 3 запроса (для составления алфавитного указателя, для подсчета кол-ва подходящих записей (для постраничного отображения) и собственно для данных), но условия у всех одинаковые.
Так вот на такие запросы тратиться непозволительно много времени (на алфавитный указатель и подсчет кол-ва записей по ~2 секунды, на саму выборку данных ~4 секунды). Есть ли у кого-нить идеи, как этот запрос можно изменить для уменьшения его времени выполнения? Мне ничего в голову не приходит
Для справки:
1) Вывод EXPLAIN для вышеуказанного запроса:
Код:
+-------+------+---------------+-------+---------+--------+-------+---------------------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+------+---------------+-------+---------+--------+-------+---------------------------------------------+
| t98 | ALL | NULL | NULL | NULL | NULL | 17130 | where used; Using temporary; Using filesort |
| t37 | ref | tname | tname | 4 | t98.id | 4 | where used; Distinct |
+-------+------+---------------+-------+---------+--------+-------+---------------------------------------------+
2) Платформа - Win32 (WinXP)
MySQL/3.23.49; PHP/4.3.0; Apache/2.0.44 (хотя последние два пункта работают нормально и от них нифига не зависит)