เริ่มจากรายละเอียดของคอมพิวเตอร์ที่ใช้ และ ubuntu version สามารถดูได้จาก System setting > Detial
รายละเอียดของคอมพิวเตอร์และUbuntu version ที่ใช้ |
ต่อไปทำการติดตั้ง PostgreSQL บน Ubuntu คำสั่งหลักๆที่ใช้ ได้กล่าวไว้ในบทความที่แล้ว(try-postgresql-on-linux.html) ซึ่งสามารถศึกษาเพิ่มเติมได้จาก เว็บไซด์ตาม URL ดังนี้ไปนี้นะคะ how-to-install-and-use-postgresql-on-ubuntu-14-04
คำสั่งที่ใช้ทำการติดตั้ง PostgreSQL บน Ubuntu
sudo apt-get update sudo apt-get install postgresql postgresql-contrib |
ต่อไปทำการติดตั้ง Sqlite3 บน Ubuntu นะคะ
sudo apt-get update sudo apt-get install sqlite3 libsqlite3-dev |
ซึ่งได้ข้อมูลมาจากเว็บไซต์ดังต่อไปนี้ how-to-install-sqlite-3-8-2-on-ubuntu-14-04
ต่อไปติดตั้ง MySQL นะคะ ซึ่งใน ubuntu จะใช้ MariaDB
การติดตั้ง MariaDB
เริ่มจาก run commandline ตามคำสั่งดังต่อไปนี้
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver
hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386]
http://mirrors.neusoft.edu.cn/mariadb/repo/10.1/ubuntu trusty main' |
จากนั้นทำการ update และ install โดยใช้คำสั่ง
sudo apt-get update
sudo apt-get install mariadb-server
|
อ้างอิงจาก downloads.mariadb.org
จากนั้นใช้คำสั่ง sudo service mysql stop เสร็จแล้วทำการ ตั้งค่ารหัศผ่าน โดยใช้คำสั่ง
sudo mysql_install_db
sudo service mysql start
sudo mysql_secure_installation
|
เสร็จแล้วจะมีหน้าให้เรากรอกรหัศผ่านที่จะใช้ลงไป
โดยสามารถเข้าใช้การบริการของ MySQL ได้จากคำสั่ง
sudo service mysql start |
sudo service mysql stop |
เป็นคำสั่งที่ใช้หยุดการบริการของ MySQL
หลังจากทำการติดตั้ง MySQL , PostgreSQL และ Sqlite3 เสร็จเรียบร้อยแล้วต่อไปจะเป็นการสร้าง Database
PostgreSQL สามารถสร้าง Database ได้จากคำสั่ง
sudo -u postgres createdb DatabaseName |
เริ่มเข้าใช้งานโดยการระบุ user ที่จะเข้าใช้ก่อนโดยที่ใน PostgreSQL มี user ชื่อ postgre ที่เป็น user ที่ดูแลระบบทั้งหมด
sudo -i -u postgres |
และเข้าไปตั้งค่า password ก่อนจึงจะสามารถใช้านได้ โดยใช้คำสั่ง
psql ALTER USER "user_name" WITH PASSWORD 'new_password'; |
จากนั้นเข้าใช้งาน Database ที่สร้างไว้ได้จากคำสั่ง
sudo -u postgres createdb DatabaseName psql DatabaseName |
โดยที่ psql เป็นคำสั่งที่ใช้เรียก command prom เพื่อเข้าใช้ Database ของ PostgreSQL
หลังจากนั้นก็สามารถ create table และ ดูคำสั่ง SQL statement ต่างๆ ได้จาก http://www.tutorialspoint.com/postgresql
Sqlite3 สามารถสร้าง Database ได้จากคำสั่ง
sqlite3 DatabaseName.db |
สามารถ create table และ ดูคำสั่ง SQL statement ต่างๆของ Sqlite ได้จาก http://www.tutorialspoint.com/sqlite
MySQL ก่อนการสร้าง Database เราต้อง login เข้าใช้งาน โดยการระบุ user และ password โดยใช้คำสั่ง
mysql -u root -p |
สามารถสร้าง Database ได้จากคำสั่ง
CREATE DATABASE name_database; |
และเข้าใช้งาน Database ได้จากคำสั่ง
USE name_database; |
สามารถ create table และ ดูคำสั่ง SQL statement ต่างๆของ MySQLได้จาก http://www.tutorialspoint.com/mysql
ทำการ Insert ข้อมูลลงใน Database โดยใช้ Python
PostgreSQL : Python Code ที่ใช้ทำการ Insert
PostgreSQL : Python Code ที่ใช้ทำการ Insert
#!/usr/bin/python
import random, string, psycopg2,timefrom string import ascii_lowercase
from random import randint
start_time = time.time()
conn = psycopg2.connect(database="trainDB",user="postgres",password="198196",host="127.0.0.1", port="5432")
c = conn.cursor()
size=[100,150,200,250,300,350,400,450,500]
mm=["01","02","03","04","05","06","07","08","09","10","11","12"]
re1=["Yes","No"]
re2=["Unlimit","15kg","30kg","45kg"]
i=3000001
day=25
month=11
year=1908
def twochar(num):
if num<10:
cha="0"+str(num)
else:
cha=str(num)
return cha
def fourchar(no):
if(no<10):
out="000"+str(no)
elif(no<100):
out="00"+str(no)
elif(no<1000):
out='0'+str(no)
else:
out=str(no)
return out
while i<=6000000:
if day == 30 and month == 12 and year == 9999:
day = 0
month = 0
year = 0
amount = randint(50,50000)
city = ''.join(random.choice(ascii_lowercase) for i in range(10))
tname = ''.join(random.choice(ascii_lowercase) for i in range(15))
rands = randint(0,8)
y = randint(0,9999)
ye = fourchar(y)
ran1 = randint(0,1)
ran2 = randint(0,3)
res = "Smoke:"+re1[ran1]+"|WeightLimit:"+re2[ran2]
m = randint(0,11)
d = randint(1,30)
y1 = randint(0,9999)
m1 = randint(0,11)
d1 = randint(1,30)
h1 = randint(0,23)
i1 = randint(0,59)
s1 = randint(0,59)
y2 = randint(0,9999)
m2 = randint(0,11)
d2 = randint(1,30)
h2 = randint(0,23)
i2 = randint(0,59)
s2 = randint(0,59)
if m==1 and d >= 29 :
d = 28
if m1==1 and d1 >= 29 :
d1 = 28
if m2==1 and d2 >= 29 :
d2 = 28
if day>=29 and month==2:
day=1
month+=1
elif day>30:
day=1
month+=1
if month>12:
month=1
year+=1
arr = fourchar(y1)+"-"+mm[m1]+"-"+twochar(d1)+" "+twochar(h1)+":"+twochar(i1)+":"+twochar(s1)
dep = fourchar(y2)+"-"+mm[m2]+"-"+twochar(d2)+" "+twochar(h2)+":"+twochar(i2)+":"+twochar(s2)
weekday = ye+"-"+mm[m]+"-"+twochar(d)
date = fourchar(year)+"-"+twochar(month)+"-"+twochar(day)
fname = ''.join(random.choice(ascii_lowercase) for i in range(8))
lname = ''.join(random.choice(ascii_lowercase) for i in range(8))
aname = fname+" "+lname
oname = ''.join(random.choice(ascii_lowercase) for i in range(8))
pname = ''.join(random.choice(ascii_lowercase) for i in range(8))
state = ''.join(random.choice(ascii_lowercase) for i in range(7))
rand_name = oname + ' ' + pname
phone = ''.join(str(randint(0,9)) for i in range(8))
noaval = randint(0,50)
total = size[rands]-noaval
c.execute("insert into RLY_STATION values ('%s','%s','%s','%s');"
%(str(i),city,rand_name,state))
c.execute("insert into TRAIN_TYPE values ('%s','%s');"
%(tname,str(size[rands])))
c.execute("insert into CAN_STOP values ('%s','%s');"
%(str(i),tname))
c.execute("insert into TRAIN values ('%s','%s','%s');"
%(str(i),str(total),tname))
c.execute("insert into TRAIN_ROUTE values ('%s','%s','%s','%s','%s');"
%(str(i),str(i),arr,dep,str(i)))
c.execute("insert into DEST_ROUTE values ('%s','%s');"
%(str(i),weekday))
c.execute("insert into FARE values ('%s','%s','%s','%s');"
%(str(i),str(i),res,str(amount)))
c.execute( "insert into ROUTE_INSTANCE values ('%s','%s','%s','%s','%s','%s','%s','%s');"
%(str(i),date,str(noaval),str(i),str(i),str(i),arr,dep))
c.execute("insert into SEAT values ('%s','%s','%s','%s');"
%(str(i),str(i),phone,aname))
print i
if i%1000000 == 1:
conn.commit()
i+=1
day+=1conn.commit()
conn.close()
print('---%s seconds---'%(time.time()-start_time))
ต้อง install library ของ Python ที่ชื่อ psycopg2 ใช้ทำการเชื่อมต่อกับ PostgreSQL ก่อน โดยใช้คำสั่ง
sudo apt-get install python-psycopg2 |
Sqlite3 : Python Code ที่ใช้ทำการ Insert
import random, string, sqlite3,time
from string import ascii_lowercasefrom random import randint
start_time = time.time()
conn = sqlite3.connect('train.db')
c = conn.cursor()
size=[100,150,200,250,300,350,400,450,500]
mm=["01","02","03","04","05","06","07","08","09","10","11","12"]
re1=["Yes","No"]
re2=["Unlimit","15kg","30kg","45kg"]
i=3000001
day=25
month=11
year=1908
def twochar(num):
if num<10:
cha="0"+str(num)
else:
cha=str(num)
return cha
def fourchar(no):
if(no<10):
out="000"+str(no)
elif(no<100):
out="00"+str(no)
elif(no<1000):
out='0'+str(no)
else:
out=str(no)
return out
while i<=6000000:
if day == 30 and month == 12 and year == 9999:
day = 0
month = 0
year = 0
amount = randint(50,50000)
city = ''.join(random.choice(ascii_lowercase) for i in range(10))
tname = ''.join(random.choice(ascii_lowercase) for i in range(15))
rands = randint(0,8)
y = randint(0,9999)
ye = fourchar(y)
ran1 = randint(0,1)
ran2 = randint(0,3)
res = "Smoke:"+re1[ran1]+"|WeightLimit:"+re2[ran2]
m = randint(0,11)
d = randint(1,30)
y1 = randint(0,9999)
m1 = randint(0,11)
d1 = randint(1,30)
h1 = randint(0,23)
i1 = randint(0,59)
s1 = randint(0,59)
y2 = randint(0,9999)
m2 = randint(0,11)
d2 = randint(1,30)
h2 = randint(0,23)
i2 = randint(0,59)
s2 = randint(0,59)
if m==1 and d >= 29 :
d = 28
if m1==1 and d1 >= 29 :
d1 = 28
if m2==1 and d2 >= 29 :
d2 = 28
if day>=29 and month==2:
day=1
month+=1
elif day>30:
day=1
month+=1
if month>12:
month=1
year+=1
arr = fourchar(y1)+"-"+mm[m1]+"-"+twochar(d1)+" "+twochar(h1)+":"+twochar(i1)+":"+twochar(s1)
dep = fourchar(y2)+"-"+mm[m2]+"-"+twochar(d2)+" "+twochar(h2)+":"+twochar(i2)+":"+twochar(s2)
weekday = ye+"-"+mm[m]+"-"+twochar(d)
date = fourchar(year)+"-"+twochar(month)+"-"+twochar(day)
fname = ''.join(random.choice(ascii_lowercase) for i in range(8))
lname = ''.join(random.choice(ascii_lowercase) for i in range(8))
aname = fname+" "+lname
oname = ''.join(random.choice(ascii_lowercase) for i in range(8))
pname = ''.join(random.choice(ascii_lowercase) for i in range(8))
state = ''.join(random.choice(ascii_lowercase) for i in range(7))
rand_name = oname + ' ' + pname
phone = ''.join(str(randint(0,9)) for i in range(8))
noaval = randint(0,50)
total = size[rands]-noaval
exec_str1 = 'insert into RLY_STATION values ('+str(i)+',"'+city+'","'+rand_name+'","'+state+'")'
exec_str2 = 'insert into TRAIN_TYPE values ("'+tname+'",'+str(size[rands])+')'
exec_str3 = 'insert into CAN_STOP values ('+str(i)+',"'+tname+'")'
exec_str4 = 'insert into TRAIN values ('+str(i)+','+str(total)+',"'+tname+'")'
exec_str5 = 'insert into TRAIN_ROUTE values ('+str(i)+','+str(i)+',"'+arr+'","'+dep+'",'+str(i)+')'
exec_str6 = 'insert into DEST_ROUTE values ('+str(i)+',"'+weekday+'")'
exec_str7 = 'insert into FARE values ('+str(i)+','+str(i)+',"'+res+'",'+str(amount)+')'
exec_str8 = 'insert into ROUTE_INSTANCE values ('+str(i)+',"'+date+'",'+str(noaval)+','+str(i)+','+str(i)+','+str(i)+',"'+arr+'","'+dep+'")'
exec_str9 = 'insert into SEAT values ('+str(i)+','+str(i)+',"'+phone+'","'+aname+'")'
print "Sqlit3 => ",i
c.execute(exec_str1)
c.execute(exec_str2)
c.execute(exec_str3)
c.execute(exec_str4)
c.execute(exec_str5)
c.execute(exec_str6)
c.execute(exec_str7)
c.execute(exec_str9)
c.execute(exec_str8)
if i%1000000 == 1:
conn.commit()
i+=1
day+=1
conn.commit()
conn.close()
print('---%s seconds---'%(time.time()-start_time))
MySQL : Python Code ที่ใช้ทำการ Insert
#!/usr/bin/pythonimport random, string, MySQLdb,time
from string import ascii_lowercasefrom random import randint
start_time = time.time()
conn = MySQLdb.connect(host= "localhost",user="root",passwd="Saii198196",db="tra_DB")
#conn = MySQLdb.connect(database="tra_DB",user="postgres",password="198196",host="127.0.0.1", port="5432")
c = conn.cursor()
size=[100,150,200,250,300,350,400,450,500]
mm=["01","02","03","04","05","06","07","08","09","10","11","12"]
re1=["Yes","No"]
re2=["Unlimit","15kg","30kg","45kg"]
i=3000001
day=25
month=11
year=1908
def twochar(num):
if num<10:
cha="0"+str(num)
else:
cha=str(num)
return cha
def fourchar(no):
if(no<10):
out="000"+str(no)
elif(no<100):
out="00"+str(no)
elif(no<1000):
out='0'+str(no)
else:
out=str(no)
return out
while i<=6000000:
if day == 30 and month == 12 and year == 9999:
day = 0
month = 0
year = 0
amount = randint(50,50000)
city = ''.join(random.choice(ascii_lowercase) for i in range(10))
tname = ''.join(random.choice(ascii_lowercase) for i in range(15))
rands = randint(0,8)
y = randint(0,9999)
ye = fourchar(y)
ran1 = randint(0,1)
ran2 = randint(0,3)
res = "Smoke:"+re1[ran1]+"|WeightLimit:"+re2[ran2]
m = randint(0,11)
d = randint(1,30)
y1 = randint(0,9999)
m1 = randint(0,11)
d1 = randint(1,30)
h1 = randint(0,23)
i1 = randint(0,59)
s1 = randint(0,59)
y2 = randint(0,9999)
m2 = randint(0,11)
d2 = randint(1,30)
h2 = randint(0,23)
i2 = randint(0,59)
s2 = randint(0,59)
if m==1 and d >= 29 :
d = 28
if m1==1 and d1 >= 29 :
d1 = 28
if m2==1 and d2 >= 29 :
d2 = 28
if day>=29 and month==2:
day=1
month+=1
elif day>30:
day=1
month+=1
if month>12:
month=1
year+=1
arr = fourchar(y1)+"-"+mm[m1]+"-"+twochar(d1)+" "+twochar(h1)+":"+twochar(i1)+":"+twochar(s1)
dep = fourchar(y2)+"-"+mm[m2]+"-"+twochar(d2)+" "+twochar(h2)+":"+twochar(i2)+":"+twochar(s2)
weekday = ye+"-"+mm[m]+"-"+twochar(d)
date = fourchar(year)+"-"+twochar(month)+"-"+twochar(day)
fname = ''.join(random.choice(ascii_lowercase) for i in range(8))
lname = ''.join(random.choice(ascii_lowercase) for i in range(8))
aname = fname+" "+lname
oname = ''.join(random.choice(ascii_lowercase) for i in range(8))
pname = ''.join(random.choice(ascii_lowercase) for i in range(8))
state = ''.join(random.choice(ascii_lowercase) for i in range(7))
rand_name = oname + ' ' + pname
phone = ''.join(str(randint(0,9)) for i in range(8))
noaval = randint(0,50)
total = size[rands]-noaval
c.execute("""insert into RLY_STATION values (%s,%s,%s,%s)""",(str(i),city,rand_name,state))
c.execute("""insert into TRAIN_TYPE values (%s,%s)""",(tname,str(size[rands])))
c.execute("""insert into CAN_STOP values (%s,%s)""",(str(i),tname))
c.execute("""insert into TRAIN values (%s,%s,%s)""",(str(i),str(total),tname))
c.execute("""insert into TRAIN_ROUTE values (%s,%s,%s,%s,%s)""",(str(i),str(i),arr,dep,str(i)))
c.execute("""insert into DEST_ROUTE values (%s,%s)""",(str(i),weekday))
c.execute("""insert into FARE values (%s,%s,%s,%s)""",(str(i),str(i),res,str(amount)))
c.execute("""insert into ROUTE_INSTANCE values (%s,%s,%s,%s,%s,%s,%s,%s)""",(str(i),date,str(noaval),str(i),str(i),str(i),arr,dep))
c.execute("""insert into SEAT values (%s,%s,%s,%s)""",(str(i),str(i),phone,aname))
print i
if i%1000000 == 1:
conn.commit()
i+=1
day+=1
conn.commit()
conn.close()
print('---%s seconds---'%(time.time()-start_time))
ต้อง install library ของ Python ที่ชื่อ MySQLdb ใช้ทำการเชื่อมต่อกับ MySQL ก่อน โดยใช้คำสั่ง
sudo apt-get install python-mysqldb |
ขนาดของไฟล์ของ MySQL , PostgreSQL และ Sqlite3 โดยการ insert ข้อมูลลงไปอย่างละ 6,000,000 ข้อมูล
PostgreSQL
สามารถดูขนาดของ Database ใน PostgreSQL ได้จาก การใช้คำสั่ง \d+
Sqlite3
MySQL
สามารถดูขนาดของ Database ใน MySQL ได้จาก การใช้คำสั่ง
SELECT table_schema "Database Name", SUM( data_length + index_length)/1024/1024
"Database Size (MB)" FROM information_schema.TABLES where table_schema = 'your Database_Name';
ตารางการเปรียบเทียบขนาดของ MySQL , PostgreSQL และ Sqlite3
PostgreSQL
|
Sqlite3
|
MySQL
|
|
Size (GB)
|
4.30
|
3.4
|
3.87
|
สรุป จากตารางขนาดไฟล์ของ Sqlite3 < MySQL < PostgreSQL
ต่อไปเป็นการ Query และเปรียบเทียบ ประสิทธฺภาพของ MySQL , PostgreSQL และ Sqlite3 บน Ubuntu
ตารางการเปรียบเทียบเวลาที่ใช้ในการ Queryของ MySQL , PostgreSQL และ Sqlite3
Query
|
ครั้งที่
|
Time
(sec)
|
||
PostgreSQL
|
Sqlite3
|
MySQL
|
||
select * from TRAIN_TYPE where
Max_seate = 200 or Max_seate = 500;
|
1
|
4.991
|
70.463
|
19.13
|
2
|
2.766
|
69.435
|
12.11
|
|
3
|
1.715
|
69.236
|
11.98
|
|
4
|
1.752
|
69.110
|
11.36
|
|
SELECT TRAIN.Train_name ,
TRAIN_ROUTE.Route_NO , TRAIN_ROUTE.Scheduleder_time FROM TRAIN INNER JOIN
TRAIN_ROUTE ON TRAIN.Train_NO =TRAIN_ROUTE.Train_NO;
|
1
|
12.86
|
638.08
|
51.39
|
2
|
12.64
|
460.49
|
49.71
|
|
3
|
33.81
|
528.63
|
34.73
|
|
4
|
19.03
|
348.06
|
37.27
|
|
SELECT Train_name FROM TRAIN WHERE
Train_NO <= 10 UNION ALL SELECT Train_name FROM CAN_STOP WHERE Station_ID
<= 100 UNION ALL SELECT Train_name FROM TRAIN_TYPE WHERE Max_seate < 50
ORDER BY Train_name;
|
1
|
18.02
|
62.89
|
16.46
|
2
|
14.09
|
54.23
|
16.18
|
|
3
|
13.92
|
45.59
|
16.34
|
|
4
|
14.15
|
49.03
|
17.95
|
ไม่มีความคิดเห็น:
แสดงความคิดเห็น