powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос по расшифровке плана выполнения запроса.
1 сообщений из 1, страница 1 из 1
Вопрос по расшифровке плана выполнения запроса.
    #39354087
max_cr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос.

Имеется множество текстовых фрагментов, которые довольно часто повторяются. Размер фрагмента от 1 до 8000 символов.
Общее число фрагментов исчисляется десятками миллионов.
Чтобы сократить занимаемый объем решено было создать таблицу с фрагментами и при добавление нового фрагмента подпрограмма ищет в этой таблице фрагмен и возвращает его id, если фрагмента нет, она добавляет его в таблицу и возвращает его новый id.
Для упрощения поиска каждому фрагменту добавляется CRC32, которое индексируется.
Таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DROP TABLE IF EXISTS t_mbodys ;

CREATE TABLE t_mbodys
(
		mbody__id INT unsigned NOT NULL AUTO_INCREMENT
	,	mbody__txt TEXT NOT NULL
	,	mbody__crc32	INT unsigned NOT NULL
	,	PRIMARY KEY ( mbody__id )
	,	INDEX t_mbodys__crc32( mbody__crc32 )
    
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



Подпрограмма
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SET sql_mode = 'TRADITIONAL,ANSI_QUOTES';
SET NAMES UTF8;


delimiter //


DROP PROCEDURE IF EXISTS hsp__mbody__get__mbody__id__INTERNAL//

CREATE PROCEDURE hsp__mbody__get__mbody__id__INTERNAL
( 
		IN	a__txt				TEXT
	,	OUT a__mbody__id		INT
	
)
END_SUB: BEGIN

	DECLARE crc32 INT UNSIGNED;
	SET crc32 = CRC32( a__txt );

	SET a__txt = TRIM( a__txt );
    
	SELECT mbody__id INTO a__mbody__id FROM t_mbodys WHERE 
				mbody__crc32 = crc32
				AND
				mbody__txt = a__mbody;
				
	IF ( ROW_COUNT() > 0 ) THEN
		LEAVE END_SUB;
	END IF;
	
	INSERT INTO t_mbodys SET mbody__crc32 = crc32, mbody__txt=a__txt;
	
	SET a__mbody__id = LAST_INSERT_ID();
	
	
END END_SUB;
//
delimiter ;



Добавить в таблицу тестовые данные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test1', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test2', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test3', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test4', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test5', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test6', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test7', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test8', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'test9', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'tes99', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'tes77', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'tes66', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'tes88', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'te466', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'te446', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'te435', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'te435', @res );
CALL hsp__mbody__get__mbody__id__INTERNAL( 'te354', @res );

SELECT * FROM t_mbodys;



Вопрос такой
При выполнение запроса в хранимой процедуре
Код: sql
1.
2.
3.
4.
EXPLAIN	SELECT mbody__id  FROM t_mbodys WHERE 
				mbody__crc32 = CRC32( 'test4' )
				AND
				mbody__txt = 'test4';



выдается такой результат
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 't_mbodys', 'ref', 't_mbodys__crc32', 't_mbodys__crc32', '4', 'const', '1', 'Using index condition; Using where'


Как это правильно расшифровать?
Я правильно понимаю, что испльзуется индекс по ЦРЦ, после чего идет выборка из полученных строк по значению текстового поля в WHERE?
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос по расшифровке плана выполнения запроса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]