பாகம்: 3
MySQL-தகவல்களைசேமித்தல்
இந்தப் பாகத்தில் அடிப்படை SQL மற்றும் MySQL commands -ஐப் பயன்படுத்தி எவ்வாறு data-வை table-க்குள் செலுத்துவது என்று பார்க்கலாம். ஆனால் programs வழியாக data-வை table-க்குள் செலுத்துவது பற்றி இப்போது அறிந்து கொள்ளத் தேவையில்லை. அதைப் பற்றி பின்னர் பார்க்கலாம்.
Data-வைtable-க்குள்செலுத்துதல்:-
INSERT table_name (list, of, columns)
VALUES (list, of, values);
INSERT book (title, author, cond)
VALUES (‘Where the Wild Things Are’,’Maurice Sendak’,
‘fine’);
Insert command மூலமாக table-க்குள் ஒன்று அல்லது அதற்கு மேற்பட்ட rows-ஐ நுழைக்கலாம். இந்த command-ன் syntax பின்வருமாறு விளக்கப்படுகிறது.
-
Insert – இதுதான் command-ன் தொடக்கம்.
-
table_name – நாம் data-வை எந்த table-க்குள் நுழைக்கவேண்டுமோ அந்த table-ன் பெயர்.
-
(list,of,columns….) – எந்தெந்த column-ல் data வை செலுத்த வேண்டுமோ அந்த columns-ஐ ஒன்றன் பின் ஒன்றாக parenthesis-க்குள் கொடுக்க வேண்டும். இதற்குள் கொடுக்கப்படாத columns ஒரு row உருவாக்கப்படும் போது default மதிப்புகளைப் பெற்றுவிடும்.
-
values – இந்த command மூலம் MySQL இதன் தொடர்ச்சியாக ஒரு சில மதிப்புகள் வரப் போகின்றன என்று தெரிந்து கொள்ளும்.
-
(list, of, values,….) – எந்தெந்த மதிப்புகள் column-ல் கொடுக்கப்பட வேண்டுமோ, அந்த மதிப்புகளை ஒன்றன் பின் ஒன்றாக ஒரு parenthesis -க்குள் கொடுக்க வேண்டும்.
ஒரேquery-ல்பலrows-ஐநுழைத்தல்:-
INSERT book (author, title, cond)
VALUES
(‘Maurice Sendak’,
‘In the Night Kitchen’,’mint’),
(‘Caroll Spinney’,’How to Be a Grouch’,’poor’),
(‘Dr. Seuss’, ‘Green Eggs and Ham’, ‘good’);
ஒவ்வொரு row insert செய்யப்படும்போதும், ஒரு தனி query எழுதுவதற்கு பதிலாக, எத்தனை rows insert செய்யப்பட வேண்டுமோ, அதனை rows -ஐயும் ஒரு தனித்தனி parenthesis-க்குள் எழுதி, அந்த parenthesis-ஐ comma-ஆல் வேறுபடுத்திக் காட்டுவதன் மூலம் ஒரே query-ல் பல rows-ஐ insert செய்யலாம்.
Auto-increment மூலம்தனித்தனிrow எண்களைஉருவாக்கல்:-
CREATE TABLE table (
column INT AUTO_INCREMENT,
…
);
Auto-increment என்று அமைக்கப்படும் column -ஆனது, அந்த table-ல் ஒவ்வொரு முறை rows insert செய்யப்படும்போதும், அதற்கான வரிசை எண்களை அந்த column-ல் தானாகவே உருவாக்கும்.
நீங்கள் ஒரு row -வை insert செய்யும் போது, auto-increment என்று இருக்கும் column-க்கு ஏதேனும் ஒரு மதிப்பினைக் கொடுத்தீர்களானால், அந்த column அந்த மதிப்பினைப் பெற்றுவிடும். அப்படி இல்லையெனில், அந்த column தானாகவே ஒன்றன்பின் ஒன்றாக இருக்கும் தொடர்ச்சியான எண்களால் நிரப்பப்படும்.
ஒரு row -ஆனது insert செய்யப்படும்போது, auto-increment column-க்கு எந்த ஒரு மதிப்பும் கொடுக்காவிட்டாலும் அல்லது NULL எனும் மதிப்பினைக் கொடுத்தாலும் அது ஒன்றாகவே கருதும். இதைப் பின்வரும் எடுத்துக்காட்டில் காணலாம்.
CREATE TEMPORARY TABLE demo (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
);
INSERT demo () VALUES ();
SELECT id FROM demo; # id contains 1
INSERT demo (id) VALUES (NULL);
SELECT id FROM demo; # id contains 1 and 2
INSERT demo (id) VALUES (4);
SELECT id FROM demo; # id contains 1, 2 and 4
INSERT demo (id) VALUES (NULL);
SELECT id FROM demo; # id contains 1, 2, 4
and 5
ஒரு table-ல் ஒரே ஒரு AUTO-INCREMENT column தான் இருக்கும் மற்றும் அது primary key-ன் ஓர் அங்கமாகவும் இருக்கும் என்பதை நினைவில் கொள்க.
ஒரு row-வை நாம் delete செய்யும்போது auto-increment column-ல் இருக்கும் தொடர்ச்சியான எண்களுக்கு இடையில் ஓர் இடைவெளி ஏற்படும். இந்த இடைவெளி பார்ப்பதற்கு வித்தியாசமாக இருந்தாலும், தொடர்ச்சியான எண்களை அடுத்தடுத்த rows-க்கு பயன்படுத்தாமல் இருப்பது, அந்த data-வின் நிலைப்புத்தன்மையை உறுதிபடுத்தும்.
MySQL function –ஐப்பயன்படுத்திதற்போதையDate மற்றும்Time –ஐinsert செய்தல்:-
INSERT some_table (some_column) VALUES (NOW ());
மேலே இருக்கும் SQL-ல் பயன்படுத்தப்பட்டுள்ள Now ()-எனும் function தற்போதைய date மற்றும் time-ஐ கொடுக்கப்பட்டுள்ள column-ல் insert செய்யப்பயன்படும்.
Now() எனும் function, call செய்யப்படும்போது அதன் MySQL server எந்த machine-ல் ஓடிக்கொண்டிருக்கிறதோ, அந்த machine-ன் date மற்றும் time-ஐ return செய்யும். பொதுவாக இந்த function return செய்யும் text-ஆனது தேவையான இடைவெளி மற்றும் punctuation-ஐப் பெற்று நாம் சுலபமாக படிக்கும் வகையில் அமையும்.
ஒருfile-ல் இருந்துSQL commands-ஐload செய்தல்:-
shell> mysql -u username -p db_name < file_name.sql
mysql> \. file_name.sql
நாம் பார்த்த பெரும்பாலான SQL commands நேரடியாக MySQL command line -ல் run செய்யப்பட்டவை. இப்போது இந்த commands-ஐ எல்லாம் ஒரு புதிய text file-ல் சேமித்து வைத்துக் கொண்டு, அதனை எவ்வாறு MySQL (அல்லது வேறு ஏதாவது client) மூலமாக run செய்யலாம் என்று பார்க்கலாம்.
மேலே கொடுக்கப்பட்டுள்ள முதல் உதாரணத்தில், command line -ல் MySQL-ஆனது batch mode-ல் run செய்யப்படுகிறது. Batch mode எனில் இந்த MySQL ஒன்று அல்லது அதற்கு மேற்பட்ட commands -ஐ run செய்து, அதற்குரிய output-ஐ கொடுத்து வெளியேறிவிடும். இதனை விளக்கமாக பின்வருமாறு காணலாம்.
1. shell> prompt -ல் MySQL server-ஐ கொடுக்கப்பட்டுள்ள username-ஐ வைத்து connect செய்யவும்.
2. பின் அதனுடன் authenticate செய்வதற்கான password prompt-ஐ அமைக்கவும்.
3. db_name என்பது default database அமைக்கப்படுவதைக் காட்டுகிறது
4. பின் commands அடங்கியுள்ள file_name.sql எனும் file-ஐ server-க்கு அனுப்பவும்.
5. அடுத்தபடியாக, இந்த commands execute செய்யப்பட்டு அதன் results தெரிவிக்கப்படும்.
6. கடைசியாக exit செய்யப்படும்.
அடுத்ததாக கொடுக்கப்பட்டிருக்கும் உதாரணத்தில், MySQL command line ஏற்கனவே பயன்பாட்டில் உள்ளதைக் காணலாம். எனவே கொடுக்கப்பட்டுள்ள file_name.sql எனும் file client-ஆல் read செய்யப்பட்டு server-க்கு அனுப்பப்படும்.
ஒருtable-ல்மற்றொருtable-ல் இருந்துஎடுக்கும்data-வைinsert செய்தல்:-
INSERT table_one (list, of, columns) SELECT …;
Insert command-ஆனது select command-வுடன் ஒன்றாக இணைந்து ஒரு
table-ல் இருந்து copy செய்யப்படும் rows-ஐ மற்றொரு table-க்குள் insert செய்யப் பயன்படுகிறது.
இந்த INSERT—-SELECT command-க்கான syntax மிகவும் சுலபமானது. Insert command-ன் முதல் பகுதியை (VALUES clause வரை) Select command-வுடன் இணைக்க வேண்டும்
இதில் Insert command-ல் இருக்கும் ஒவ்வொரு column-க்கும், select statement-ல் இருந்து ஒரு column, return செய்யப்படுகிறதா என்பதை உறுதி செய்து கொள்ளவும்.
Text files-லிருந்துதகவல்களைimport செய்தல்:-
LOAD DATA INFILE ‘some_file.txt’
INTO TABLE ‘some_table’ (list, of, columns, …);
Data-வை பிற applications-லிருந்து MySQL-க்கு import செய்யும்போது, முதலில் அந்த data-வை ஒழுங்குபடுத்தப்பட்ட text format ஆக மாற்றி (Eg: tab-separated values) அதன்பின் MySQL-ல் import செய்ய வேண்டும்.
இவ்வாறு அல்லாமல் அந்த data-வை ஒரு set of SQL queries-ஆக மாற்றி அதன் பின்னரும் import செய்யலாம். ஆனால் இவ்வாறு செய்வது, அதிக நேரம் பிடிக்கக்கூடியதாகவும், மிகுதியான தவறுகளுக்கு நம்மை உட்படுத்தக்கூடியதாகவும் இருக்கும்.
எனவே LOAD DATA INFILE எனும் command, text files-ல் இருக்கும் வடிவமைக்கப்பட்ட data-வை MySQL-க்குள் செலுத்தப் பயன்படும் ஒரு எளிமையான வழியாகும்.
இந்த text file-க்குள் இருக்கும் data-வின் ஒவ்வொரு field-ம் ஒரு tab-ஆலும், ஒவ்வொரு row-ம் ஒரு புதிய line-ஆலும் ஒழுங்குபடுத்தப்பட்டிருக்கும். இந்த LOAD DATA INFILE எனும் command இத்தகைய ஒழுங்குபடுத்தப்பட்ட file-ஐ எவ்வாறு import செய்வது என்பதை தானாகவே புரிந்துகொள்ளும் வகையில் இருக்கும். file-ல் இருக்கும் ஒவ்வொரு row-ம் இந்த command-ஆல் read செய்யப்பட்டு பின்னர் அதற்குரிய table-ல் column mapping-ஐ பயன்படுத்தி அந்த row செலுத்தப்படும்.
உதாரணத்துக்கு /users/zak/books_and_authors.txt எனும் இடத்தில் சேமித்துவைக்கப்பட்டுள்ள பின்வரும் சாரத்தை உள்ளடக்கிய இந்த file எவ்வாறு book எனும் table-க்கு மாற்றப்படுகிறது என்று பார்க்கலாம்.
Where the Wild Things Are Maurice Sendak fine
Cigars of the Pharoah Herge good
… … …
இதனை upload செய்வதற்கான command பின்வருமாறு அமையும்.
USE library;
LOAD DATA INFILE ‘/Users/zak/books_and_authors.txt’
INTO TABLE book (title, author, cond);
இந்த command, run செய்யப்பட்ட பின்னர், book எனும் table-ல் பின்வருமாறு rows இணைக்கப்பட்டிருக்கும்.
+———+—————+—————-+——+
| book_id | title | author | cond |
+———+—————+—————-+——+
| 5 | Cigars of … | Herge | good |
| 6 | Where the … | Maurice Sendak | fine |
| 7 | … | … | … |
+———+—————+—————-+——+
LOAD DATA INFILE எனும் command-ல் பின்வருவனவற்றை கவனிக்கவும்.
-
MySQL server இயங்கும் அதே machine-ல் datafile இருக்க வேண்டும்.
-
Data load செய்யப்படவேண்டிய file-ஐ குறிப்பிடும்போது அதன் பெயரை மட்டும் குறிப்பிடாமல் அதன் முழு path-ஐயும் குறிப்பிட வேண்டும். இல்லையெனில், இந்த MySQL server குறிப்பிட்ட path-ல் தேடாமல், வேறு எங்காவது அதன் data directory-ல் தேடிக்கொண்டிருக்கும்
-
Windows systems-ல் கூட நீங்கள் backslash-க்கு பதிலாக forward slash-ஐ பயன்படுத்தி path-ஐ குறிப்பிடலாம். உதாரணத்துக்கு unix-style path (‘/Users/zak/books_and_authors.txt’) என்று குறிப்பிடப்படுகிறது என்றால், அது windows-ல் ‘C:/Desktop/book_and_authors.txt’ என்று குறிப்பிடப்படும். இங்கு நீங்கள் backslash-ஐ பயன்படுத்தினால் அது character escape sequences-ஆக interpret செய்யப்படும்.
மேலும் பின்வரும் குறிப்புகள், இந்த load data infile -ன் பயன்பாட்டை இன்னும் சுலபமாக அமைக்கும்.
இந்த command-ன் output ஒரு warning அல்லது error-வுடன் வருகிறது எனில்(eg: Query OK, 3 rows affected, 1 warning (0.01 sec)), SHOW WARNINGS அல்லது SHOW ERRORS எனும் command-ஐப் பயன்படுத்தி அது எவ்வகையான பிரச்சனைகளைக் கொண்டுள்ளது என்று பார்க்கலாம்.
நீங்கள் அமைத்துள்ள LOAD DATA INFILE சரியாக இயங்குகிறதா என்பதை சரிபார்க்க, உண்மையான table-ஐப் போலவே ஒரு temporary table-ஐ தற்காலிகமாக உருவாக்கி, அதில் சிறிதளவு data-வை load செய்து பார்க்கலாம். இது பின்வருமாறு அமையும்.
USE library;
# Create a temp table like your real table
CREATE TEMPORARY TABLE book_temp LIKE book;
# load in part of your data
LOAD DATA INFILE
‘/Users/zak/books_and_authors.txt’
INTO TABLE book_temp (title, author, cond)
IGNORE 195 LINES;
# ignore the first 195 lines
SELECT * FROM book_temp;
# see if things look ok
இந்த command நீங்கள் எவ்வாறு data-வை import செய்ய வேண்டும், எந்த format-ல் அது இருக்க வேண்டும் மற்றும் எவ்வளவு rows செலுத்தப்பட வேண்டும் என்பதை விளக்கும் வகையில் பல options-களைப் பெற்றிருக்கும்.
விரைவாகதகவல்களைinsert செய்தல்:-
நீங்கள் ஒரு table-ல் தொடர்ந்து பலமுறை data-வை insert செய்யும்போது ஏற்படும் performance பிரச்சனைகளைத் தீர்க்க பின்வரும் வழிவகைகளைக் கையாளலாம்.
முதலில் அனைத்து rows -ம் ஒரே முறையில் insert செய்யப்பட வேண்டுமா அல்லது ஒவ்வொன்றாக insert செய்யப்பட வேண்டுமா என்பதைப் பொருத்து வெவ்வேறு முறைகள் பின்பற்றப்படுகின்றன.
1. ஒரே முறையில் பல rows -ஐ நுழைத்தல் :-
முதலாவதாக ஒரே முறையில், நிறைய rows, insert செய்யப்படுவதற்கான வழிவகைகளைப் பின்வருமாறு காணலாம்.
-
Load data infile ஐப் பயன்படுத்தலாம். இதன் மூலம் client மற்றும் serverஆனது table-ல் insert செய்யப்படவேண்டிய data-வை உருவாக்குவதற்காக எடுத்துக்கொள்ளப்படும் நேரம் குறைக்கப்பட்டு அதன் performance அதிகரிக்கப்படுகிறது.
-
Alter table command-ஐப் பயன்படுத்தி, index உருவாதலை தற்காலிகமாக disable செய்து வைக்கலாம். இது data அனைத்தும் insert செய்யப்பட்ட பின்னர் ஒரே ஒரு படியில் table indexes -ஐ உருவாக்குவதற்கு வழிவகை செய்யும். எடுத்துக்காட்டு:
ALTER TABLE table_name DISABLE KEYS;
# Many INSERT statements here
ALTER TABLE table_name ENABLE KEYS;
-
MyISAM tables-ல் data insert செய்யப்படும்போது table -ஐ lock செய்து விடவும். இது அந்த data அதே நேரத்தில் table -லிலிருந்து read செய்யப்படுவதைத் தவிர்த்து அதனால் ஏற்படும் performance இழப்பைக் குறைக்கிறது. இதற்கான code பின்வருமாறு அமையும்
LOCK TABLES table_name WRITE;
# Many INSERT statements here
UNLOCK TABLES;
-
InnoDB tables-ல் நமது அனைத்து Insert statement -ஐயும் ஒரு transaction-க்குள் அமைத்து, அதைப் பின்வருமாறு run செய்யலாம்.
BEGIN;
# Many INSERT statements here
COMMIT;
-
Mutivalue Insert-ஐப் பயன்படுத்தலாம். இதன் மூலம் client மற்றும் server, table-ல் data, insert செய்யப்படுவதற்கு முன்னர் query-யை process செய்வதற்கு செய்யும் வேலையைக் குறைக்கப் பயன்படுகிறது. இதைப்பற்றி ஏற்கனவே”ஒரே query-ல் பல rows-ஐ insert செய்தல்” எனும் தலைப்பில் பார்த்துள்ளோம்.
2. பல reads மூலம் பல rows -ஐ insert செய்வதற்கான வழிவகைகளைப் பின்வருமாறு காணலாம்.
-
MyISAM tables-ல் Delay_Key_Write option -ஐ enable செய்யவும். இது tables-ன் index-ல் புதிய entries உருவாக்கப்படும்போது, MySQL ஏற்படுத்த வேண்டிய disk writes-ஐ குறைக்கப் பயன்படுகிறது. இதனை நீங்கள் Alter table command-ஐப் பயன்படுத்தி பின்வருமாறு செய்யலாம்.
ALTER TABLE table_name DELAY_KEY_WRITE = 1;
-
InnoDB tables-ஐப் பயன்படுத்தவும். இது ஒரே நேரத்தில் பலவகையான reads மற்றும் writes-ஐ MyISAM tables-ஐ விட திறமையாகக் கையாளும்.
-
Read செய்யும் table-லிலேயே write செய்ய வேண்டாம். மாறாக writes-ஐ கையாளுவதற்கு ஒரு table-ஐ உருவாக்கி பின்னர் write table-ல் இருக்கும் rows-ஐ read table-க்கு ஒரு குறிப்பிட்ட இடைவெளியில் merge செய்யவும். இதில் performance-ஐ அதிகரிக்க, முன்னர் குறிப்பிட்ட bulk insert tips-ஐப் பயன்படுத்தலாம்.