2011-10-08 30 views
2

我的MySQL數據庫有一個表3列,使用指數與MySQL表

其strucure:

CREATE TABLE `Table` (
    `value1` VARCHAR(50) NOT NULL DEFAULT '', 
    `value2` VARCHAR(50) NOT NULL DEFAULT '', 
    `value3` TEXT NULL, 
    `value4` VARCHAR(50) NULL DEFAULT NULL, 
     `value5` VARCHAR(50) NULL DEFAULT NULL, 
     PRIMARY KEY (`value1`, `value2`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 
ROW_FORMAT=DEFAULT 

第一和第二列是: varchar(50)

,他們都結合主鍵 第三列是 text,

t他表包含100多萬條記錄我使用的第一列它需要幾分鐘

搜索一個具體項目做我的搜索。

我如何索引此表以加快我的搜索速度以及使用哪種索引類型?

+1

您是否曾嘗試在'value1'上添加索引? – shuniar

+1

@shuniar'PRIMARY KEY(...)'_is_索引。 – Bojangles

+0

@JamWaffles,但主鍵是「value1」和「value2」的組合鍵,而不僅僅是「value1」 – shuniar

回答

5

50 + 50個字符的主鍵?它包含什麼?你應該認爲桌子是第三種常規形式嗎?聽起來這個關鍵本身可能包含一些信息,聽起來像是一個警鐘。

如果你可以改變你用別的東西更短,更易於管理的主鍵,有一些事情你可以嘗試:

  • 外化文字3不同的表,由新的主鍵
  • 匹配分析表中,以確定相應的更優化的長度,與SELECT FROM xcve_info PROCEDURE ANALYSE()
  • 改變字段的大小,而不是50個字符,如果你能負擔得起額外的空間變化VARCHAR到CHAR
  • 添加索引到value1,這可能不應該是主鍵的一部分

總是檢查更改的性能,看看它們是否值得。

1

我可以看到,有可能會改善的事情,唯一的事情是將一個唯一索引添加到第一列。如果第一列實際上不是唯一的,這顯然不起作用,並且它是否比現有的主鍵更有效率是有問題的。我認爲這可能會有所幫助的方式是,如果第一列的唯一索引小於主鍵(索引掃描會更快)。

此外,您可能能夠在您的第一列的部分創建一個索引,也許只有5個或10前幾個字符,這可能是更有效的。

而且,刪除和/或插入大量的數值後,記得運行受影響的表ANALYZE TABLE,甚至OPTIMIZE TABLE。這樣,MySQL查詢優化器的統計信息就會更新。

3

什麼是您正在執行的實際查詢?索引只會幫助您搜索前綴(或確切)匹配。例如:

SELECT * FROM Table WHERE value1='Foo%' 

會找到任何與富貴開始,並應使用指數和相對較快。另一方面:

SELECT * FROM Table WHERE value1='%Foo%' 

將不會使用索引,您將被迫執行全表掃描。如果您需要這樣做,則應使用全文索引和查詢:http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

0

但是,爲什麼要在非唯一列上搜索唯一項目?你爲什麼不能根據你的主鍵進行查詢?如果由於某種原因,你不能那麼我會索引值1,你正在搜索的列。

CREATE INDEX「INDEX_NAME」 ON「表」(列)

1

始終是一個壞主意,用這麼長的字符串作爲指標,但如果你真的需要搜索它的方式考慮你怎麼樣過濾查詢是因爲MySQL無法對索引執行類似操作,所以像WHERE value1 LIKE "%mytext%"這樣的條件將永遠不會使用索引,而是嘗試搜索更短的字符串,以便MySQL可以將該操作轉換爲相等的操作。例如,使用:value1 = "XXXXX"其中「XXXXX」是該字符串的一部分。要確定比較字符串的最佳長度,請分析您的字段的選擇性。

也要考慮到像(value1, value2)這樣的多個字段索引不會使用第二個字段,除非第一個字段完全匹配。這不是一個糟糕的指數,只是讓你知道並理解它是如何工作的。

如果還是不行的作品,另一種解決方案可能是商店值1值2在新表(表2爲例)與自動增量id字段,然後從添加一個外鍵table2使用ID(fe my_long_id),最後在table2上創建一個索引,如:my_idx (value1, value2)。搜索將是這樣的:

SELECT t1.* 
FROM 
    table2 as t2 
INNER JOIN Table as t1 ON (t1.my_long_id = t2.id) 
WHERE 
    t2.value1 = "your_string" 

確保表2具有像(value1, value2)的索引和表對(my_long_id)主索引。

作爲最終建議,將AUTO_INCREMENT添加爲PRIMARY KEY並將(value1,values2)添加爲唯一/常規密鑰。這有很大的幫助,因爲B-Tree存儲已排序的索引,所以使用100個字符的字符串會使您在此排序中浪費I/O。 InnoDB在插入時確定該索引的最佳位置,可能需要將一些索引移動到另一個頁面,以便爲新索引獲得一些空間。使用自動增量值可以更輕鬆,更便宜,因爲它永遠不需要做這樣的動作。