MySQL ereg?

zip111

Новичок
проскакивала мысль.. шибко много записей валить в темп надо будет. Неоправдано
 

craz

Нестандартное звание
проскакивала мысль.. шибко много записей валить в темп надо будет. Неоправдано
валите часть... есть же скорее всего какая то и другая область пересечения множества нужного вам и множества которое 100% в себе содержит нужные данные при этом она не все 100% записей
 

Mols

Новичок
Ну дык Вы не гадайте, а обратитесь к производителю официально... мол так и так, просим добавить такой-то индекс.
Пусть ответят.
И если начнут в позу становиться, тогда уже и будете костыли прикручивать.
Только сначала всё свалите в тестовую таблицу и убедитесь, что все ваши потребности удовлетворятся этим индексом))) Чтобы не появилась через неделю новая потребность к ним обращаться.
 

Mols

Новичок
Мда... кстати с таблицей "клоном" тоже проблем то нет... ведь записи исходной таблицы в части `pricelist_id`,`code` остаются не изменны и уникальны....
А значит делаете ещё одна табличку
PHP:
CREATE TABLE `prices_clone` (
`id` bigint(5) unsigned NOT NULL auto_increment,
`code` varchar(16) NOT NULL,
PRIMARY KEY (`id`),
KEY `code` (code(5))
)
И клонируете туда часть исходных данных...(все строки, но не все столбцы. ИД должны совпадать как в исходной так и в клоне)
Потом просто, чтобы не всю таблицу перезаписывать периодически делаете
PHP:
SELECT max(id) FROM  `prices_clone`;

INSERT INTO `prices_clone`  SELECT `prices`.id, `prices`.code FROM  `prices` WHERE `prices`.id > (значение из первого запроса);
Потом можете джойнить клон с Вашей таблицей.... всё будет быстро... но это костыль.
 

zip111

Новичок
нет, не пойдет..
коды не только добавляются, но и удаляются почти хаотично. То есть клон не будет клоном и соответствовать оригиналу ((

да и в целом невыгодно это. Этот запрос будет исполняться раз 50 000 за сутки, каждый раз вносить поправки в таблицу-клон не комильфо.
Пока все-же мой костылевый вариант с UNION наиболее прижился в коллективе
 

zip111

Новичок
В общем, в конечном итоге запрос принял такой вариант (это учитывая весь функционал, что он должен делать)

PHP:
SELECT * FROM (
	(SELECT terminators.id, terminators.name, code, price, increment, activation_time
		FROM config.prices
		JOIN config.pricelists ON pricelists.id = prices.pricelist_id
		JOIN config.billing_packs ON billing_packs.id = pricelists.billing_pack_id
		JOIN config.terminators ON terminators.billing_pack_id = billing_packs.id
		WHERE pricelists.id = 			
			(
				SELECT id
				FROM pricelists
				WHERE billing_pack_id = billing_packs.id
				AND activation_time <= NOW( )
				ORDER BY id DESC
				LIMIT 1
			)
		AND prices.code = '380445'
		AND prices.enabled = 'y')
	UNION
	(SELECT terminators.id, terminators.name, code, price, increment, activation_time
		FROM config.prices
		JOIN config.pricelists ON pricelists.id = prices.pricelist_id
		JOIN config.billing_packs ON billing_packs.id = pricelists.billing_pack_id
		JOIN config.terminators ON terminators.billing_pack_id = billing_packs.id
		WHERE pricelists.id = 			
			(
				SELECT id
				FROM pricelists
				WHERE billing_pack_id = billing_packs.id
				AND activation_time <= NOW( )
				ORDER BY id DESC
				LIMIT 1
			)
		AND prices.code = '38044'
		AND prices.enabled = 'y')
	UNION
	(SELECT terminators.id, terminators.name, code, price, increment, activation_time
		FROM config.prices
		JOIN config.pricelists ON pricelists.id = prices.pricelist_id
		JOIN config.billing_packs ON billing_packs.id = pricelists.billing_pack_id
		JOIN config.terminators ON terminators.billing_pack_id = billing_packs.id
		WHERE pricelists.id = 			
			(
				SELECT id
				FROM pricelists
				WHERE billing_pack_id = billing_packs.id
				AND activation_time <= NOW( )
				ORDER BY id DESC
				LIMIT 1
			)
		AND prices.code = '3804'
		AND prices.enabled = 'y')
	UNION
	(SELECT terminators.id, terminators.name, code, price, increment, activation_time
		FROM config.prices
		JOIN config.pricelists ON pricelists.id = prices.pricelist_id
		JOIN config.billing_packs ON billing_packs.id = pricelists.billing_pack_id
		JOIN config.terminators ON terminators.billing_pack_id = billing_packs.id
		WHERE pricelists.id = 			
			(
				SELECT id
				FROM pricelists
				WHERE billing_pack_id = billing_packs.id
				AND activation_time <= NOW( )
				ORDER BY id DESC
				LIMIT 1
			)
		AND prices.code = '380'
		AND prices.enabled = 'y')
	UNION
	(SELECT terminators.id, terminators.name, code, price, increment, activation_time
		FROM config.prices
		JOIN config.pricelists ON pricelists.id = prices.pricelist_id
		JOIN config.billing_packs ON billing_packs.id = pricelists.billing_pack_id
		JOIN config.terminators ON terminators.billing_pack_id = billing_packs.id
		WHERE pricelists.id = 			
			(
				SELECT id
				FROM pricelists
				WHERE billing_pack_id = billing_packs.id
				AND activation_time <= NOW( )
				ORDER BY id DESC
				LIMIT 1
			)
		AND prices.code = '38'
		AND prices.enabled = 'y')
			UNION
	(SELECT terminators.id, terminators.name, code, price, increment, activation_time
		FROM config.prices
		JOIN config.pricelists ON pricelists.id = prices.pricelist_id
		JOIN config.billing_packs ON billing_packs.id = pricelists.billing_pack_id
		JOIN config.terminators ON terminators.billing_pack_id = billing_packs.id
		WHERE pricelists.id = 			
			(
				SELECT id
				FROM pricelists
				WHERE billing_pack_id = billing_packs.id
				AND activation_time <= NOW( )
				ORDER BY id DESC
				LIMIT 1
			)
		AND prices.code = '3'
		AND prices.enabled = 'y')
) as temp
GROUP BY terminators.id
ORDER BY price ASC
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 73 Using temporary; Using filesort
2 DERIVED terminators ALL billing_pack_id NULL NULL NULL 73
2 DERIVED billing_packs eq_ref PRIMARY PRIMARY 2 config.terminators.billing_pack_id 1 Using where; Using index
2 DERIVED pricelists eq_ref PRIMARY PRIMARY 2 func 1 Using where
2 DERIVED prices ref pricelist_id pricelist_id 55 config.pricelists.id 1 Using where
3 DEPENDENT SUBQUERY pricelists index NULL PRIMARY 2 NULL 436 Using where
4 UNION terminators ALL billing_pack_id NULL NULL NULL 73
4 UNION billing_packs eq_ref PRIMARY PRIMARY 2 config.terminators.billing_pack_id 1 Using where; Using index
4 UNION pricelists eq_ref PRIMARY PRIMARY 2 func 1 Using where
4 UNION prices ref pricelist_id pricelist_id 55 config.pricelists.id 1 Using where
5 DEPENDENT SUBQUERY pricelists index NULL PRIMARY 2 NULL 436 Using where
6 UNION terminators ALL billing_pack_id NULL NULL NULL 73
6 UNION billing_packs eq_ref PRIMARY PRIMARY 2 config.terminators.billing_pack_id 1 Using where; Using index
6 UNION pricelists eq_ref PRIMARY PRIMARY 2 func 1 Using where
6 UNION prices ref pricelist_id pricelist_id 55 config.pricelists.id 1 Using where
7 DEPENDENT SUBQUERY pricelists index NULL PRIMARY 2 NULL 436 Using where
8 UNION terminators ALL billing_pack_id NULL NULL NULL 73
8 UNION billing_packs eq_ref PRIMARY PRIMARY 2 config.terminators.billing_pack_id 1 Using where; Using index
8 UNION pricelists eq_ref PRIMARY PRIMARY 2 func 1 Using where
8 UNION prices ref pricelist_id pricelist_id 55 config.pricelists.id 1 Using where
9 DEPENDENT SUBQUERY pricelists index NULL PRIMARY 2 NULL 436 Using where
10 UNION terminators ALL billing_pack_id NULL NULL NULL 73
10 UNION billing_packs eq_ref PRIMARY PRIMARY 2 config.terminators.billing_pack_id 1 Using where; Using index
10 UNION pricelists eq_ref PRIMARY PRIMARY 2 func 1 Using where
10 UNION prices ref pricelist_id pricelist_id 55 config.pricelists.id 1 Using where
11 DEPENDENT SUBQUERY pricelists index NULL PRIMARY 2 NULL 436 Using where
12 UNION terminators ALL billing_pack_id NULL NULL NULL 73
12 UNION billing_packs eq_ref PRIMARY PRIMARY 2 config.terminators.billing_pack_id 1 Using where; Using index
12 UNION pricelists eq_ref PRIMARY PRIMARY 2 func 1 Using where
12 UNION prices ref pricelist_id pricelist_id 55 config.pricelists.id 1 Using where
13 DEPENDENT SUBQUERY pricelists index NULL PRIMARY 2 NULL 436 Using where
NULL UNION RESULT <union2,4,6,8,10,12> ALL NULL NULL NULL NULL NULL

Время исполнения 0,25 сек. Что на таком объеме данных в целом допустимо.
 

zip111

Новичок
так пробовали в начале темы. Индексы коряво юзает. А optimize помогает на 10-15 минут.
 
Сверху