banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu !  XML
  [Question]   [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 16/04/2008 15:09:36 (+0700) | #1 | 125549
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
Hiện nay mình có 1 table khoảng trên 350.000 dòng (nếu xuất ra file tầm khoảng 60MB).
Mỗi lần insert 1 row mới thì phải check xem nội dung đã tồn tại hay chưa -> add 1 row mới mất trên 1s, add 150-200 row thì chờ lâu đắm đuối luôn.

Hiện tại mình đang sử dụng :

Code:
<?
$truyvan=@mysql_query("select * from table_name where fi='value'");
if(@mysql_num_row($truyvan)==0)
//thêm dữ liệu
else
//thông báo đã tồn tại
?>


Mình đang sử dụng Database là MySql.

Bạn nào có cách thoát khỏi tình trạng này thì bày giúp mình nhé.

Xia xỉa smilie
[Up] [Print Copy]
  [Question]   [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 16/04/2008 15:36:25 (+0700) | #2 | 125552
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]

phamquoc_truong wrote:
Hiện nay mình có 1 table khoảng trên 350.000 dòng (nếu xuất ra file tầm khoảng 60MB).
Mỗi lần insert 1 row mới thì phải check xem nội dung đã tồn tại hay chưa -> add 1 row mới mất trên 1s, add 150-200 row thì chờ lâu đắm đuối luôn.

Hiện tại mình đang sử dụng :

Code:
<?
$truyvan=@mysql_query("select * from table_name where fi='value'");
if(@mysql_num_row($truyvan)==0)
//thêm dữ liệu
else
//thông báo đã tồn tại
?>


Mình đang sử dụng Database là MySql.

Bạn nào có cách thoát khỏi tình trạng này thì bày giúp mình nhé.

Xia xỉa smilie  


if(@mysql_num_row($truyvan)==0)

chào bác phamquoc_truong, bác có thể nói rõ hơn chút về chỗ màu cam được không ?, câu truy vấn đó đả động đến những field nào .. ?, đã index ?
[Up] [Print Copy]
  [Question]   Re: [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 16/04/2008 16:06:14 (+0700) | #3 | 125554
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
hi secmask,

Code:
where fi='value'


Fi=field

Động đến 1 field duy nhất là field nội dung(dạng text).
[Up] [Print Copy]
  [Question]   Re: [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 16/04/2008 16:45:59 (+0700) | #4 | 125557
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
bác thử index full text cho field đó đi, nhanh hơn nhiều đấy.
[Up] [Print Copy]
  [Question]   Re: [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 16/04/2008 17:02:56 (+0700) | #5 | 125558
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
Code:
link    INDEX    link    45
link_2    FULLTEXT    link


Mình đã index field link(text) với size = 45 và FULLTEXT rồi mà.
[Up] [Print Copy]
  [Question]   Re: [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 16/04/2008 22:16:58 (+0700) | #6 | 125575
[Avatar]
canh_nguyen
Elite Member

[Minus]    0    [Plus]
Joined: 23/08/2004 18:55:09
Messages: 775
Location: Broken dream
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
@phamquoc_truong: Lão có tạo index rồi nhưng cách truy vấn lại dùng kiểu thông thường chứ không phải cho dạng fulltext search.

Code:
SELECT count(*) FROM table_name WHERE MATCH (fi) AGAINST ('value');


Thử như vậy coi sao smilie . Coi thêm cái này:

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

[Up] [Print Copy]
  [Question]   Re: [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 17/04/2008 00:15:31 (+0700) | #7 | 125615
[Avatar]
phamquoc_truong
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2004 07:54:12
Messages: 79
Location: PeaceWorld
Offline
[Profile] [PM]
Thanks Mr. Cảnh. Nhưng tình hình là vẫn sai sót ở đâu đó . . . hic hic . . . Câu truy vấn đó còn lâu hơn cả cái cũ ! hic hic

Mình xin trình bày chi tiết như sau :

Mình có 1 table linkpage gồm : id, link, userid

mình đã fulltext trường link với keyname là : link
index trường link (với 45 ký tự) với keyname là link_1

mình sử dụng câu truy vấn :

Code:
<?
 $truyvan=@mysql_query("select * from linkpage where link like '%$value%'");
 if(@mysql_num_row($truyvan)==0)
 //thêm dữ liệu
 else
 //thông báo đã tồn tại
 ?>


Thực ra dữ liệu còn là mức nhỏ nhưng việc truy vấn kiểm tra 1 dữ liệu mất khoảng 1-1.5s. -> 100-200 link thì chờ rất lâu.

Mong mọi người bày cách chi tiết để mình khắc phục tình trạng này.

Cảm ơn mọi người !
[Up] [Print Copy]
  [Question]   Re: [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 17/04/2008 10:46:40 (+0700) | #8 | 125757
aguest
Member

[Minus]    0    [Plus]
Joined: 07/09/2006 23:48:15
Messages: 90
Offline
[Profile] [PM]
Có thể nào server của bạn "yếu đuối" quá nên MySQL chạy "đắm đuối" luôn?

Code:
like '%$value%'


Chỗ này là nó chạy "mút mùa lệ thủy" đó. Có lẽ bạn nên coi lại tại sao mình phải so sánh string như vậy? Có thể thay đổi được không?

Cách hay hơn là cứ cho người ta add link vô database, rồi có một cái night job nào đó buổi tối để đi clean up, như vậy sẽ dễ hơn? smilie

Hoặc là add vô 1 cái table tạm nào đó, rồi có cái job chạy mỗi 15ph để so sánh cái string rồi add vô table chính...
[Up] [Print Copy]
  [Question]   Re: [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 17/04/2008 11:43:01 (+0700) | #9 | 125767
safari
Member

[Minus]    0    [Plus]
Joined: 31/01/2008 01:19:23
Messages: 33
Location: somewhere
Offline
[Profile] [PM]
index trường link (với 45 ký tự) với keyname là link_1  
mà lại xài điều kiện kiểu này
like '%$value%'  
thì cái index đó là vô nghĩa. Index thông thường (ko phải full text index) trên trường dữ liệu dạng ký tự (char, varchar, text, ...) chỉ support dạng query 'value%' chứ ko áp dụng cho dạng '%value%".

Ko hiểu được lý do tại sao bồ phải dùng "%value%" mà ko phải là dạng 'value%', có lẽ link bồ lưu ko phải là link tuyệt đối (full URL)???

Tốt nhất là chuyển tất cả các link thành dạng full URL, sau đó dùng hàm băm (hash) để băm chuỗi link đó thành chuỗi ngắn hơn và có chiều dài cố định (md5, FNV, MurmurHash), tạo index trên trường dữ liệu này và thực hiện query dạng 'value%'.
[Up] [Print Copy]
  [Question]   Re: [Q]Cơ sở dữ liệu (MYSQL) quá lớn, truy vấn quá lâu ! 17/04/2008 22:19:35 (+0700) | #10 | 125816
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Mình đã từng thử FULLTEXT index, table cũng khoảng > 100k rows, search trên nhiều field khác nhau, kết quả vẫn rất khả thi ==> FULLTEXT index vẫn là 1 giải pháp tốt. Và khi query với FULLTEXT index thì bạn nên dùng Boolean full-text search mode.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|