Проблемы с большими массивами

12
A
На сайте с 09.01.2013
Offline
33
1031

Господа подскажите как решить лучше данную проблему:

есть таблица в sql в которую записываю данные, таблица постоянно увеличивается, а во время записи стоит проверка обычным SELECT на наличии схожего id_детали. Так вот, чем больше уже записей в таблице, тем медленней добавляются новые. Как можно максимально увеличить производительность?

Mad_Man
На сайте с 10.11.2008
Offline
162
#1

Что значит "схожего"? Насколько схожего? Какой SQL диалект используется? Какой тип поля у `id_детали`?

A
На сайте с 09.01.2013
Offline
33
#2

Точное совпадение, если "324535" уже присутствует в базе, то с массива мы его записывать не будем, а перейдем к следующему элементу массива.

Mad_Man
На сайте с 10.11.2008
Offline
162
#3

СУБД какая?

sashka_
На сайте с 27.01.2010
Offline
103
#4

Вот так нужно проверять существование данных в таблице

select count(*) as `count` from `table` where `id_детали` = ''

поставить index на поле `id_детали`, и сделать ему тип int, если такое не стоит.

Тогда всё будет норм.

И да если много раз надо сделать insert, лучше это сделать одним запросом.

Знаю PHP, JS, jQuery. Помощь для вашего сайта. (/ru/forum/840509).
[Удален]
#5

antyan, все уже реализовано за Вас. Никаких селектов не нужно.

Укажите необходимое поле как уникальное


ALTER TABLE `ВАША_ТАБЛИЦА` ADD UNIQUE (
`id_детали`
);

Этого будет достаточно, чтобы INSERT не проходил. Никаких проверок выполнять не нужно, MySQL сам разберется.

sashka_, count в принципе очень ресурсозатратный запрос, да еще если в большой таблице ее выполнять. Поэтому Ваш запрос только усугубит ситуацию. Да и нужды в нем нет никакой.

M0
На сайте с 04.02.2009
Offline
86
#6
teent:

Этого будет достаточно, чтобы INSERT не проходил. Никаких проверок выполнять не нужно, MySQL сам разберется.

Следующий будет вопрос, почему ошибка, когда деталь есть в базе ☝

Для вставки используем INSERT IGNORE

I
На сайте с 28.03.2011
Offline
37
#7

самое смешное когда окажется что id_детали в понимании ТС это артикул, или другая цифрено-буквенная маркировка детали.

Помогаю не только словом.. (/ru/forum/830720)
siv1987
На сайте с 02.04.2009
Offline
427
#8
teent:
sashka_, count в принципе очень ресурсозатратный запрос, да еще если в большой таблице ее выполнять. Поэтому Ваш запрос только усугубит ситуацию. Да и нужды в нем нет никакой.

Вы сильно ошибаетесь. Сам по себе count ни разу не ресурсозатратный, его функция состоит в том чтобы подсчитать количество соответствующих условию записей, ищет запись и инкрементирует переменную счетчик, проще быть не может. При прочих равных count будет быстрее

A
На сайте с 19.07.2010
Offline
130
#9
sashka_:
Вот так нужно проверять существование данных в таблице

select count(*) as `count` from `table` where `id_детали` = '' 


а зачем здесь лишний count(*) ?

можно упростить запрос:

select id from `table` where `id_детали` = '' 
или
select '1' as id from `table` where `id_детали` = ''

если запрос дал пустоту, то детали нет. можно даже не получать поле id из запроса...

а вообще, как сказали выше - уник. индекс

.............
[Удален]
#10

siv1987, не буду спорить. Тем более count(*).

P.S.: Поищите статью о тестах производительности count на хабре. Они удручают.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий