Як ўставіць дадзеныя ў MySQL напрамую (не выкарыстоўваючы SQL запытаў)

У мяне ёсць базы дадзеных MySQL, які я выкарыстоўваю толькі для рэгістрацыі. Яна складаецца з некалькіх простых двайніка табліц MyISAM. Існуе заўсёды адзін лакальны (г.зн. знаходзіцца на той жа машыне) кліента, які толькі запісвае дадзеныя ў БД і некалькі аддаленых кліентаў, якія могуць толькі счытваць дадзеныя.

Што мне трэба, каб ўставіць грамады даных з лакальнага кліента як мага хутчэй.

Я ўжо спрабаваў шмат падыходаў, каб зрабіць гэта хутчэй, напрыклад, скарачэнне колькасці уставак шляхам павелічэння даўжыні спісу значэнняў, або з дапамогай LOAD DATA INFILE .. і некаторыя іншыя.

Цяпер мне здаецца, што я прыйшоў да абмежавання разбору значэнняў з радка яе мэтавай тыпу дадзеных (не мае значэння, калі гэта робіцца пры апрацоўцы запытаў або тэкставы файл).

<�Моцны> Так што пытанне:

робіць MySQL даць некаторыя сродкі маніпулявання дадзеных непасрэдна для лакальных кліентаў (гэта значыць, не выкарыстоўваючы SQL)? Можа быць, ёсць некаторы API, якія дазваляюць ўстаўляць дадзеныя, проста перадаючы паказальнік.

<�Моцны> Яшчэ раз. Я не хачу, каб аптымізаваць код SQL або спасылацца на адны і тыя ж запыты ў сцэнары, як hd1 параіў. Тое, што я хачу, каб перадаць буфер дадзеных непасрэдна ў ядро ​​базы дадзеных. Гэта азначае, што я не хачу, каб выклікаць SQL наогул. Ці магчыма гэта?

1
Дзе вы хочаце перадаць паказальнік?
дададзена аўтар NullPointer, крыніца
Я маю на ўвазе, што я хацеў бы некаторыя функцыі, як несапраўдным ўстаўка (сімвал * TABLENAME, несапраўдны * дадзеныя, Int dataLen) і дадзеныя будуць утрымліваць значэнне слупкоў. Такім чынам, я мог бы ўставіць дадзеныя ў табліцу і пазбягаць выкарыстання SQL (гэта значыць сінтаксічнага аналізу). Ці нешта накшталт гэтага.
дададзена аўтар Evgeny Porodnov, крыніца
Вось каментар для ўсіх, хто adviceing мяне, каб выкарыстоўваць адну вялікую ўстаўку або для блакавання/разблакоўкі табліцы або іншыя аптымізацыі кода SQL. Я ўжо спрабаваў усе гэтыя падыходы. Я не зацікаўлены ў аптымізацыі SQL. Тое, што я хачу, каб перадаць дадзеныя непасрэдна да маторных базы дадзеных з дапамогай некаторых API і перадаючы буфер для яго.
дададзена аўтар Evgeny Porodnov, крыніца

8 адказы

Выкарыстоўвайце для MySQL LOAD DATA Каманда:

Запісаць дадзеныя ў файл у фармаце CSV затым выканаць гэтую каманду АС:

LOAD DATA INFILE 'somefile.csv' INTO TABLE mytable

For more info, see the documentation

1
дададзена
Каманда загрузка шлях хутчэй, чым адна памылка ўстаўкі. І няма, няма "прамых ін'екцыйнага» метаду. Гэта бліжэй за ўсё да таго, што вы хочаце. Гэта тое, што я хацеў бы выкарыстаць, калі мне трэба нешта накшталт гэтага.
дададзена аўтар Bohemian, крыніца
Я спрабаваў, але я думаю, што ёсць яшчэ некаторыя накладныя выдаткі разбору дадзеных з тэкставага файла. Такі падыход сапраўды хутка, але не нашмат хутчэй, чым выкананне адной вялікай ўстаўкі з тымі ж дадзенымі, што і ў CSV-файл. Ці ёсць спосаб перадачы дадзеных, як ёсць. Можа быць, некаторыя twiks да крыніцы дадзеных MySQL або што-небудзь.
дададзена аўтар Evgeny Porodnov, крыніца

Акрамя INFILE LOAD DATA, я не ўпэўнены, ці ёсць іншы спосаб, каб атрымаць дадзеныя ў MySQL без выкарыстання SQL. Калі вы хочаце, каб пазбегнуць разбору некалькі разоў, вы павінны выкарыстоўваць кліенцкую бібліятэку, якая падтрымлівае звязванне параметру, запыт можа быць разабрана і падрыхтаваны адзін раз і выконваецца некалькі разоў з рознымі дадзенымі.

Тым не менш, я вельмі сумняваюся, што разбор запыту з'яўляецца вузкім месцам. Ці з'яўляецца гэта выдзелены сервер базы дадзеных? Якія жорсткія дыскі выкарыстоўваюцца? Ці з'яўляюцца яны хутка? Ці ёсць у вашага кантролера RAID батарэі рэзервовай памяці? Калі так, то вы можаце аптымізаваць аперацыі запісу на дыск. Чаму вы не выкарыстоўваеце InnoDB замест MyISAM?

1
дададзена
Не ўсе SSD-дыскі хутка пры запісе дадзеных. Вы таксама можаце паспрабаваць выкарыстоўваць INSERT DELAYED: dev.mysql.com/ док/RefMan/5,5/о/ўставіць-delayed.html . Дакументы кажуць, што гэта карысна для лесанарыхтоўчых сітуацый.
дададзена аўтар bobwienholt, крыніца
Драйверы дыска не варта выкарыстоўваць шмат рэсурсаў працэсара. Сам дыск будзе вузкім месцам, таму што гэта значна больш павольна, чым памяць.
дададзена аўтар bobwienholt, крыніца
Злучныя параметры гучаць вельмі цікава. Я паспрабую.
дададзена аўтар Evgeny Porodnov, крыніца
Што тычыцца сервера базы дадзеных, гэта крыху экзатычнае прымяненне MySQL. У мяне ёсць PLC (праграмуемы лагічны кантролер), які павінен увайсці некаторыя дадзеныя аб сабе (да БД MySQL), а затым перадаць яго futher некаторых часопісаў сервераў. Гэты ПЛК мае SSD дыскаў. Такім чынам, яны павінны быць вельмі хутка. Тым не менш, яны занадта малыя. І менавіта таму я выкарыстоўваю MyISAM, таму што я тады пакет DB файлы з дапамогай myisampack.
дададзена аўтар Evgeny Porodnov, крыніца
Ну, я ўпэўнены, што запіс дадзеных на дыск не з'яўляецца вузкім месцам. Паколькі ў адпаведнасці з прафілявання драйвера інфармацыйнага дыска выкарыстоўвае нашмат менш хуткасць працэсара, то MySQL дэман.
дададзена аўтар Evgeny Porodnov, крыніца

без выкарыстання ўстаўкі інструкцыі, выкарыстоўвайце «Sqllite Studio» для ўстаўкі дадзеных у MySQL. Гэта бясплатна і з адкрытым зыходным кодам, так і можна спампаваць і праверыць.

1
дададзена

Лепшы спосаб для ўстаўкі дадзеных на MS SQL без выкарыстання ўстаўкі ў або абнаўленні запытаў толькі для доступу да MS SQL інтэрфейсу. Пстрыкніце правай кнопкай мышы на імя табліцы і выберыце «Рэдагаваць топ 200 радкоў». Тады вы будзеце мець магчымасць дадаваць дадзеныя ў базу дадзеных напрамую, проста набраўшы ў вочку. Для вас, каб уключыць пошук або з дапамогай выбару або іншых каманд SQL проста клікніце правую кнопку мышы на любым з 200 радкоў, якія вы выбралі. Перайсці да панэлі, затым выберыце SQL, і вы можаце дадаць SQL каманды. Праверце гэта. : D

1
дададзена
MS SQL ня MySQL, якая з'яўляецца тое, што ОП пытаўся пра
дададзена аўтар hd1, крыніца
Вы жартуеце? Вы нават чытаць пытанне?
дададзена аўтар Evgeny Porodnov, крыніца

INSERT into foo (foocol1, foocol2) VALUES ('foocol1val1', 'foocol2val1'),('foocol1val2','foocol2val2') and so on should sort you. More information and sample code will be found here. If you have further problems, do leave a comment.

<�Моцны> UPDATE

Калі вы не хочаце выкарыстоўваць SQL, то паспрабуйце гэты скрыпт, каб зрабіць так шмат уставак, як вы хочаце, змясціць яго ў файл, скажам insertToDb.sh, і атрымаць на свой дзень/вечар:

#!/bin/sh
mysql --user=me --password=foo dbname -h foo.example.com -e "insert into tablename (col1, col2) values ($1, $2);"

Заклічце як ш insertToDb.sh col1value col2value . Калі я да гэтага часу не зразумеў ваш пытанне, пакінуць яшчэ адзін каментар.

0
дададзена
Глядзіце мой выбар, толькі цяпер
дададзена аўтар hd1, крыніца
Як я ўжо сказаў, я ўжо выкарыстоўваю гэты падыход. Пытанне заключаецца не ў тым, як аптымізаваць запыт, але як ўставіць дадзеныя, не выкарыстоўваючы запыты на ўсіх.
дададзена аўтар Evgeny Porodnov, крыніца

З MySQL вы можаце ўставіць некалькі картэжаў з адным ўставіць заяву. Я не прыклад, таму што я зрабіў гэта некалькі гадоў таму і не маюць крыніцы больш.

0
дададзена

Разгледзім, як згадвалася выкарыстоўваць адзін INSERT з некалькімі значэннямі:

INSERT INTO table_name (col1, col2) VALUES (1, 'A'), (2, 'B'), (3, 'C'), ( ... )

Гэта прыводзіць да вас толькі таго, каб падлучыцца да базы дадзеных з адным вялікім запытам, а не некалькі менш. Гэта лягчэй прыняць ва ўсім кушэтцы праз дзверы адзін раз, чым бегаючы ўзад і наперад з усімі разабранымі часткамі канапы, адкрываючы дзверы кожны раз. :)

Акрамя таго, вы таксама можаце запусціць LOCK TABLES имя_таблицы WRITE перад INSERT і UNLOCK TABLES пасля гэтага. Гэта не забяспечыць, што нічога іншага ўстаўляецца ў час.

табліцы блакавання </а>

0
дададзена

Пасля таго, некаторыя даследаванні я не знайшоў спосабу перадачы дадзеных непасрэдна туздо ядру базы дадзеных (без разбору яго).

Мая мэта складалася ў тым, каб паскорыць абмен дадзенымі паміж лакальным кліентам і серверам БД як мага больш. Ідэя была ў тым, калі кліент з'яўляецца лакальным, то ён можа выкарыстоўваць некаторыя функцыі API для перадачы дадзеных у БД рухавік такім чынам, не выкарыстоўваючы (г.зн. сінтаксічнага аналізу) SQL і значэнне ў ім. Адзінае блізкае рашэнне было прапанавана <�моцны> bobwienholt (з выкарыстаннем падрыхтаванага аператара і звязванне параметраў). Але LOAD DATA INFILE .. апынуўся трохі хутчэй, у маім выпадку.

0
дададзена