Tin tức Việt

Thứ Năm, 7 tháng 11, 2013

Mysql explain and indexing strategies

Nguồn tin: Walking Alone

Khi viết 1 câu sql, ta thường explain để biết câu sql của ta có tốt hay chưa, nhưng thường ta sẽ gặp khó khăn vì để hiểu explain muốn nói gì và tối ưu hóa câu sql là cả 1 vấn đề. Nhưng trước tiên ta phải hiểu được câu explain là thế nào đã:


A) Giải thích:

1) Select Types:

SIMPLE: Câu sql cơ bản, không có sub queries và union.

PRIMARY: Câu lệnh Select cấp độ cao nhất.

DERIVED: Câu queries có liên quan đến table gốc.

UNION: Câu lệnh queries là câu > 2 trong toàn bộ câu sql.

…

Nói chugn phần này không quan trọng, chỉ nói lên bản chất của câu queries hiện tại có thể loại là gì.


2) Join Types:

const: Câu sql dùng primary key hoặc unique key => very fast. (1)

eq_ref: Câu sql dùng biểu trưng khóa ngoại kết nối khóa chính. (select cust.* from cust, comment where comment.id_cust = cust.id) => fast (2)

ref: Câu sql có dùng index bình thường (không unique) => medium (3)

ref_or_null: Câu sql có dùng index bình thường (không unique) và tìm trong cả giá trị null trong index column => medium (4)

index_merge: Câu sql có dùng nhiều index để tìm (do đặt index không đúng nên xảy ra tình trạng này). (4)

unique_subqueries: Câu sql để lấy ra giá trị từ sub queries trả về primary (unique) key. Ví dụ câu select * from node where id_cust in (select id from customers where fullname = ‘song’) sẽ trả về những record đều là primary (unique) key. (2)

index_subqueries: Tương tự unique_subqueries nhưng lần này là lấy giá trị từ giá trị trả về là index key. VD: explain select * from node where id_cust in (select id_cust from comment where comment.name = ‘song’). (3)

range: trả về 1 vùng trong những row có dùng index, thường dùng cho những câu in, between… (4)

index: giống ALL nhưng nhanh hơn ALL 1 tí. (5)

ALL: chậm nhất vì không dùng index. (6)


Ghi chú (1) -> (6): Tốc độ từ nhanh nhất (1) tới chậm nhất (6).


B) Tối ưu:

- Sử dụng mysql > 5.0. Vì bản < 5.0 không hỗ trợ index tốt.

- Dùng table với số column càng ít càng tốt, nếu phải dùng nhiều row thì áp dụng các chiến thuật phân mảnh.

- Đặt index cho các tất cả các case ta cần để tối ưu. Ví dụ: index_a_b(fieldA, fieldB), index_a_c(fieldA, fieldC), index_b_c(fieldB, fieldC), index_a_b_c(fieldA, fieldB, fieldC).

- Luôn cố gắng đưa số rows về thấp nhất có thể.

- Tránh không cho field extra có giá trị là filesort bằng cách đặt index phù hợp hoặc thay inner join bằng left join. (filesort xuất hiện khi lượng dữ liệu trả về là quá lớn hoặc do dùng inner join…)


C) Thực hành, ví dụ ta có database sau:



CREATE TABLE IF NOT EXISTS `node` (
`id` int(10) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `node_search_city` (
`id_node` int(15) NOT NULL,
`id_item` int(3) NOT NULL,
PRIMARY KEY (`id_node`,`id_item`),
KEY `id_node` (`id_node`),
KEY `id_item` (`id_item`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `node_search_district` (
`id_node` int(15) NOT NULL,
`id_item` int(4) NOT NULL,
PRIMARY KEY (`id_node`,`id_item`),
KEY `id_node` (`id_node`),
KEY `id_item` (`id_item`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `node_search_tag_vn` (
`id_node` int(18) NOT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id_node`,`name`),
KEY `name` (`name`),
KEY `id_node` (`id_node`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Nếu ta muốn lấy ra danh sách những quán cafe nằm ở thành phố có id = 2, quận có id = 3. Thường ta sẽ viết câu sql sau:



select j.*
from node as j
inner join node_search_tag_vn as c on c.id_node = j.id
inner join node_search_district as d on d.id_node = j.id
inner join node_search_city as t on t.id_node = j.id
where d.id_item = 3 and t.id_item = 2 and c.name = 'cafe'
group by j.id
order by j.id desc

– 20 record / 0.69s


1 64 zpsbfa0241a Mysql explain and indexing strategies

3 16 zpsf694aa85 Mysql explain and indexing strategies


Nhìn vào câu explain thì ta có thể thấy mysql khá thông minh khi nhận ra nếu bắt đầu lọc từ table district thì số row trả về sẽ luôn là thấp nhất(469). Nhưng khi mysql auto như vậy thì câu lệnh group by và order by của ta sẽ mất index vì lúc này trật tự đã đảo lộn.


Vậy để xử lý thì tùy vào business logic, nếu ta chú trọng vào city thì đặt key chính ở city, district thì đặt key chính ở district, ở đây mình chú trọng vào name => mình sẽ làm như sau đầu tiên lấy ra xét key word là ‘cafe’ rồi order by, group by tại đó luôn, sau đó sẽ xét tới các yếu tố khác như city, district…

Khi đã xác định được luồng đi của câu sql, thì ta có thể viết câu sql như sau:



select j.id from (select result.id_node from (select c.id_node from (select id_node from node_search_tag_vn as c where c.name = 'cafe' group by c.id_node order by c.id_node desc) as c inner join node_search_city as t on t.id_node = c.id_node and t.id_item = 2) as result inner join node_search_district d on d.id_node = result.id_node and d.id_item = 3) as result
inner join node as j on result.id_node = j.id

– 20 record / 0.02s (Nhanh ~ 30 lần câu sql đầu)


 Mysql explain and indexing strategies

4 13 zpsde1c90d9 Mysql explain and indexing strategies


Với cùng 1 kết quả trả về nhưng câu sql sau mà ta vừa viết có thời gian thực thi nhanh gấp 20 lần câu 1, nguyên nhân là vì lúc này index của ta đã được kích hoạt, và ta có thể order by, group by theo đúng ý định của mình => Performance của project sẽ tăng 1 cách đáng kể.




WalkingAlone Đăng ký: Viet Blogs

Nguồn tin

Thứ Tư, 6 tháng 11, 2013

40 logo shopping cart ấn tượng dành cho bạn

Nguồn tin: dohoavn

Trong bài này, chúng tôi bổ sung thêm 40 mẫu logo ấn tượng nhất về thể loại shopping cho cảm hứng của bạn , chủ đề lần này sẽ tập trung vào mix mart, Life Style, Eco shopping, My Shopping cart, The Store and Great Buys. Dohoavn.net mời bạn xem 40 mẫu logo ấn tượng này

40 logo shooping cart ấn tượng dành cho bạn


40 logo shooping cart ấn tượng dành cho bạn 40 logo shooping cart ấn tượng dành cho bạn 40 logo shooping cart ấn tượng dành cho bạn


40 logo shooping cart ấn tượng







Đăng ký: Viet Blogs

Nguồn tin

Một loạt các vụ nổ tại văn phòng Đảng Cộng Sản Trung Quốc làm một người chết

Lương Tâm @ nguontinviet.com

Một loạt các vụ nổ nhỏ đã giết chết ít nhất một người bên ngoài một văn phòng địa phương của Đảng Cộng sản cầm quyền ở miền bắc Trung Quốc.


no tai trung quoc 1


Theo Tân Hoa Xã đưa tin thì đã có một loạt các vụ nổ tại thành phố Thái Nguyên, thủ phủ tỉnh Sơn Tây, Trung Quốc đường như được gây ra bởi bom tự chế, các vụ nổ đã làm bị thương 8 người và làm hư hỏng 2 chiếc xe.


no tai trung quoc 3

chiếc xe hư hại do vụ nổ


Những hình ảnh đăng trên các phương tiện truyền thông xã hội cho thấy khói và xe chữa cháy tại hiện trường vụ việc, lúc đó là khoảng 7h40 sáng ngày 06 tháng 11 (giờ địa phương), 23h40 giờ GMT.


no tai trung quoc 4 Lính cứu hỏa, cảnh sát và xe chữa cháy


Không có bất kỳ lời giải thích nào được đưa ra nhưng theo các nhà sử học thì trong quá khứ đã từng xảy ra những vụ việc tương tự do người dân cảm thấy bất bình với các tổ chức chính quyền địa phương.


Vụ việc khiến cho tình hình an ninh tại Trung Quốc trở nên nghiêm trọng hơn nữa vì vào tuần trước đã xảy ra vụ một chiếc xe đâm vào đám đông tại quảng trường Thiên An Môn tại Bắc Kinh làm rúng động dư luận. Có lẽ hai vụ việc có liên quan với nhau vì sau đó Chính quyền đã lên tiếng chỉ trích đây là một cuộc tấn công khủng bố cực đoan từ khu vực phía tây của khu tự trị Tân Cương.


Một bài đăng trên trang blog của cảnh sát Sơn Tây đã ghi lại “một số thiết bị nổ nhỏ được tìm thấy trên phố Yingze, Thái Nguyên, gần các văn phòng tỉnh ủy. Sau đó lãnh đạo tỉnh đã đến ngay lập tức, cảnh sát cũng được triển khai ngay sau đó. Cảnh sát cũng tìm được một số viên bi thép, bảng mạch và vật liệu nổ tương tự tại hiện trường, Các thiết bị nổ được giấu bên trong các bồn hoa bên đường.”


Một bài phòng vấn nhân chứng trên Tân Hoa Xã lại nói rằng họ thấy một xe tải nhỏ phát nổ làm các mảnh vỡ xe bay tứ tung. Một bức ảnh vừa được đăng trên trang blog Sina Weibo đã cho thấy cửa sổ xe, lốp xe bị hư hại năng do vụ nổ, bên cạnh là các viên bi kim loại


Nạn nhân của các vụ nổ đang hồi phục dần, riêng có một người vẫn đang trong tình trạng nguy kịch.


no tai trung quoc 2

Những viên bi trong bom tự chế


Trên Sina Weibo đã có một bài viết về vấn đề an ninh tại Trung Quốc hiện nay, bài viết chỉ trích hành động dùng các vòng bi để chế tạo bom là quá tàn nhẫn. Một bloger cho biết “trong tình hình hiện tại, tốt nhất là bạn không nên lãng vãng gần những khu vực có biểu tượng chính trị, nếu không thì sẽ bị vạ lây đó.”


Một bloger khác nói “Điều này cho thấy các chính sách cao tay của nhà nước không phát huy tác dụng như họ tuyên bố mà chỉ làm dấy lên sự giận dữ từ phía người dân mà thôi.”


Cảnh sát cho biết tình hình giao thông tại đường Yingze đã được phục hồi, người dân có thể đi lại bình thường.




Đăng ký: Viet Blogs

Nguồn tin

Nguồn Tin Mới