有足夠大的貨物數據庫穩步增加。現在DB中有超過1000萬的商品。數據庫工作的優化
有一個很好的,有它的類別。每件商品都具有以下屬性:名稱,價格,出售商品數量,擔保標誌和質量等。產品的特徵僅針對特定類別。貨物的屬性具有下一個格式 - 2000:10000(屬性的類別:屬性的值)。某些類別的屬性和屬性本身可能會在各種類別(如品牌)中重疊。過濾,排序和搜索標題和財產是由這些類別和屬性進行的。該產品可以鏈接到一個或多個類別。
起初我們只使用mysql並通過爲每個類別創建表來存儲貨物。通過這種方式,我們有大約6-7,000個有貨物的餐桌。選擇時,我們向每個人發出請求,並在操作員UNION的幫助下合併請求。隨着商品數量和類別的增加,選擇開始需要很長時間並且配置mysql服務器。 之後,我們將所有產品移到一個表中。表格結構如下[http://clip2net.com/s/5OUKXm。
該表有1000萬個產品使得現在很難使用mysql。從它的選擇是不可能的,沒有談論排序。我們使用sphinx,索引獅身人面像:。
sql_query = SELECT \
ti.item_id, \
ti.item_id AS iid, \
crc32(ti.item_nick) AS nick, \
ti.item_title AS title, \
ti.item_sold AS sold, \
ti.item_rating AS rating, \
ti.item_popular AS popular, \
ti.item_warranty AS warranty, \
ROUND(ti.item_price*100, 0) AS price, \
ti.item_props AS props, \
COUNT(c.comment_iid) AS comments, \
GROUP_CONCAT(tcir.category_item_ref_tid) AS tids \
FROM item AS ti \
LEFT JOIN comment AS c ON ti.item_id = c.comment_iid \
INNER JOIN category_item_ref AS tcir ON ti.item_id = tcir.category_item_ref_iid \
WHERE ti.item_id >= $start AND ti.item_id <= $end \
GROUP BY ti.item_id
sql_attr_uint = sold
sql_attr_uint = rating
sql_attr_uint = comments
sql_attr_uint = warranty
sql_attr_bigint = iid
sql_attr_bigint = nick
sql_attr_bigint = price
sql_attr_bigint = popular
sql_attr_multi = uint tids from field;
搜索通過獅身人面像速度較快,但也有許多屬性,在減緩搜索和600000個貨物分揀採樣時間特別sql_attr_multi TIDS約爲18 -19秒我們試圖扳平產品只有一個類別(一個屬性tids變爲sql_attr_uint),採樣時間減少到3〜5秒,這也不是很好。
你能告訴我,我做錯了什麼,它可能是值得建立一個索引獅身人面像另一種方式,因爲我認爲它應該工作得更快。也許,我需要以另一種方式構建表結構,或者爲數據庫使用不同的平臺,例如MySQL,MongoDB,PostgreSQL,MariaDB。