|
|
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Есть таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. в таблице помимо id может быть любое количество разных полей с индексами. В таблице существует запись: Код: sql 1. 2. 3. 4. выплняю запросы: Код: sql 1. 2. После каждого запроса мне нужно вывести id записи. При наличии похожих данных (запрос 1) вывести id существущей записи. При отсутствии подобных данных в таблице (запрос 2), записать данные и вывести что-то вроде last_insert_id(). Это все делается удачно в вышеописанном коде, но делается жутко долго. Если использовать ON DUPLICATE KEY UPDATE, то нужно чтобы id был уникальным полем и обязательно передавался в запросе. Поэтому запрос: Код: sql 1. не срабатывает, как хотелось бы, а просто записывает еще одну запись в таблицу. Можно ли заставить при insert делать проверку на дубликаты по передаваемым полям, а не по уникальному ключу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:05:36 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlМожно ли заставить при insert делать проверку на дубликаты по передаваемым полям, а не по уникальному ключу?Что мешает создать еще один уникальный ключ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:19:44 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sqlМожно ли заставить при insert делать проверку на дубликаты по передаваемым полям, а не по уникальному ключу?Что мешает создать еще один уникальный ключ? какой например? name не могу, так как владимиров может быть много, как и surname. для ясности скажу, что путем парсинга xml данных я записываю их в базу. в разных xml могут быть сведения об одном и том же человеке. в таком случае мне нужно избежать запись, а просто вывести id существующей записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:28:01 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlкакой например?(`name`, `surname`) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:35:16 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql name не могу, так как владимиров может быть много, как и surname. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:37:01 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, Не понял, что Вы хотите сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:37:31 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql, Не понял, что Вы хотите сказать. я хочу сказать, что ни одно поле сделать уникальным я не могу. Так как имена могут повторяться, как и фамилии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:44:18 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, Так я предлагаю не "одно поле", а уникальный ключ из двух полей. Даже круглые скобки оставил, чтобы удобно было в синтаксис копипастить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:46:33 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql, Так я предлагаю не "одно поле", а уникальный ключ из двух полей. Даже круглые скобки оставил, чтобы удобно было в синтаксис копипастить. То есть как-то так ? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:55:47 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Значит запрос делаю такой: Код: sql 1. А можно ли как-то максимально быстым образом вывести id после добавления в базу или вывести id существующей записи, если она есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:05:57 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlА можно ли как-то максимально быстым образом вывести id после добавления в базу или вывести id существующей записи, если она есть? просто, если это реализовать на php, то получается такой процесс: 1. делаю insert 2. при положительном результате делаю select last_insert_id() 3. при отрицательном результате делаю select id from...where {поля которые пытался записать} И если записей несколько десятков тысяч, то система виснет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:09:39 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Делай 1) Insert Ignore 2) Select. Этого достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:20:01 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqllast_insert_id()last_insert_id() полезен и в случае INSERT ... ON DUPLICATE KEY UPDATE. См. LAST_INSERT_ID() , в т.ч. последний пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:25:09 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlИ если записей несколько десятков тысяч, то система виснетА это, скорее всего, потому что индексов не хватает. Создание ключа и этот момент облегчит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:25:56 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlАртем_sqlА можно ли как-то максимально быстым образом вывести id после добавления в базу или вывести id существующей записи, если она есть? просто, если это реализовать на php, то получается такой процесс: 1. делаю insert 2. при положительном результате делаю select last_insert_id() 3. при отрицательном результате делаю select id from...where {поля которые пытался записать} И если записей несколько десятков тысяч, то система виснет Артем, такая задача решается так: в браузере на яваскрипте запускается очередь по модели связного списка на коллбеках и прогоняется весь список, таким образом каждое обращение к бекенду становится относительно дешевым и хотя у нас увеличивается время всей обработке и мы создаем чуть большую нагрузку на трафик, но сервер при этом мы не выжигаем, а система обретает огромную стабильность. Это решение проверено в очень серьезных проектах и не с десятками тысяч, а с дестяками миллионов записей! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 21:02:58 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sqlМожно ли заставить при insert делать проверку на дубликаты по передаваемым полям, а не по уникальному ключу?Что мешает создать еще один уникальный ключ? Очевидно, отсутствие естественного ключа ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 00:35:16 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlАртем_sqlА можно ли как-то максимально быстым образом вывести id после добавления в базу или вывести id существующей записи, если она есть? просто, если это реализовать на php, то получается такой процесс: 1. делаю insert 2. при положительном результате делаю select last_insert_id() 3. при отрицательном результате делаю select id from...where {поля которые пытался записать} И если записей несколько десятков тысяч, то система виснет Лучше это делать на сервере, одним запросом, в хранимой процедуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 00:37:42 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
MasterZivЛучше это делать на сервере, одним запросом, в хранимой процедуре. Не понимаю, почему запрос Код: sql 1. выводит id существующей записи, а если я делаю так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. в обоих случая ответ null. Почему так? что я не так делаю? подскажите плиз.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 14:14:57 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, А где Вы взяли конструкцию RETURN (SELECT ...) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 14:18:46 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql, А где Вы взяли конструкцию RETURN (SELECT ...) ? В инете копался, искал всякие примеры по созданию функций. Изначально мой код был такой: [code] BEGIN SET isset_id = (select id from `fixtures` where `sport`=sport_name); IF isset_id is not null THEN RETURN isset_id; ELSE INSERT INTO `fixtures` ( `sport`) VALUES ,sport); SET insert_id = (select last_insert_id() as id); RETURN insert_id; END IF; END; [code] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 14:22:03 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, Возможно, тот код был для других СУБД. Освойте конструкцию SELECT ... INTO ... См. http://dev.mysql.com/doc/refman/5.5/en/select-into.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 14:31:28 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
ничего не понимаю... В таблице имеются записи: Код: sql 1. 2. 3. Код процедуры: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Делаю запросы: Код: sql 1. 2. Как так? Что не так в коде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 16:05:57 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql Код: sql 1. id всегда равно id, чтобы это ни было :) Называйте объекты в БД разными именами. Хотя бы в пределах одной области видимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 16:08:22 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql Код: sql 1. id всегда равно id, чтобы это ни было :) Называйте объекты в БД разными именами. Хотя бы в пределах одной области видимости. а разве id и `id` - это не разные вещи? никогда не обращал внимание на это :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 16:14:05 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlа разве id и `id` - это не разные вещи?Нет, это одно и то же. Апострофы не обязательны для употребления, если идентификатор может быть корректно выделен в тексте запроса. Например, идентификаторы, которые совпадают с ключевыми словами, обязательно заключать в апострофы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 16:19:34 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
В итоге получилось такое чудо: Код: 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. но так как цикл большой, и в нем используется 5 вот таких процедур, процесс становится очень долгим. по полчаса проходит по циклу, в итоге обрубается из-за ограничения сервера. Можно ли как-то оптимизировать код процедуры или запросы, чтобы быстрее работало? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 19:58:37 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
если судить по Код: sql 1. 2. то нет ничего удивительного в долгом выполнении.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 20:33:35 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
вадяесли судить по Код: sql 1. 2. то нет ничего удивительного в долгом выполнении.... а на что заменить? посоветуй плиз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 20:44:31 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, Сдается мне, что вообще всю эту процедуру можно заменить на один SQL-запрос вида INSERT ... ON DUPLICATE KEY UPDATE (См. комменты про LAST_INSERT_ID().) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 20:55:13 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql, Сдается мне, что вообще всю эту процедуру можно заменить на один SQL-запрос вида INSERT ... ON DUPLICATE KEY UPDATE (См. комменты про LAST_INSERT_ID().) все началось именно с on duplicate key :D но в процессе я запутался и ушел в глубь. Во всяком случае по времени выполнения первых 5 запросов видно, что процедуры работают быстрее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2014, 00:25:09 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlВо всяком случае по времени выполнения первых 5 запросов видно, что процедуры работают быстрее:Если цифры - это время, то медленнее, насколько я вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2014, 00:43:22 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sqlВо всяком случае по времени выполнения первых 5 запросов видно, что процедуры работают быстрее:Если цифры - это время, то медленнее, насколько я вижу. ой, я местами перепутал..:D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2014, 11:05:40 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlвадяесли судить по Код: sql 1. 2. то нет ничего удивительного в долгом выполнении.... а на что заменить? посоветуй плиз Код: sql 1. и есть подозрение, что ТС надо озвучить полную задачу, а не кусочки её решения, тогда может и будет предложено быстрое, правильное решение. а так, по выше описанному, видно, что ТС не вполне владеет темой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2014, 11:24:36 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
вадяАртем_sqlпропущено... а на что заменить? посоветуй плиз Код: sql 1. и есть подозрение, что ТС надо озвучить полную задачу, а не кусочки её решения, тогда может и будет предложено быстрое, правильное решение. а так, по выше описанному, видно, что ТС не вполне владеет темой. как расшифровывается ТС? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 13:49:10 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1834203]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 403ms |

| 0 / 0 |
