簡體   English   中英

如何為 MySQL 表添加索引?

[英]How do I add indexes to MySQL tables?

我有一個非常大的 MySQL 表,其中包含大約 150,000 行數據。 目前,當我嘗試運行時

SELECT * FROM table WHERE id = '1';

代碼運行良好,因為 ID 字段是主索引。 但是,對於該項目的最新發展,我必須按另一個字段搜索數據庫。 例如:

SELECT * FROM table WHERE product_id = '1';

該字段以前沒有被索引; 但是,我添加了一個,所以 mysql 現在索引該字段,但是當我嘗試運行上述查詢時,它運行得非常慢。 EXPLAIN 查詢顯示,當我已經添加了 product_id 字段時,沒有索引,因此該查詢需要 20 分鍾到 30 分鍾的任何時間才能返回一行。

我的完整解釋結果是:

| id | select_type | table | type | possible_keys| key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
|  1 | SIMPLE      | table | ALL  | NULL         | NULL | NULL    | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+

請注意,我剛剛查看了一下,ID 字段存儲為 INT,而 PRODUCT_ID 字段存儲為 VARCHAR,這可能會有所幫助。 這可能是問題的根源嗎?

ALTER TABLE `table` ADD INDEX `product_id_index` (`product_id`)

永遠不要將integer與 MySQL 中的strings進行比較。 如果idint ,請刪除引號。

ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);

您可以使用此語法添加索引並控制索引類型(HASH 或 BTREE)。

create index your_index_name on your_table_name(your_column_name) using HASH;

或者

create index your_index_name on your_table_name(your_column_name) using BTREE;

您可以在此處了解 BTREE 和 HASH 索引之間的差異: http : //dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

可以添加兩種類型的索引:定義主鍵時,MySQL默認將其作為索引。

解釋

主鍵作為索引

假設您有一個tbl_student表並且您希望student_id作為主鍵:

ALTER TABLE `tbl_student` ADD PRIMARY KEY (`student_id`)

上面的語句添加了一個主鍵,這意味着索引值必須是唯一的,不能為 NULL。

指定索引名稱

ALTER TABLE `tbl_student` ADD INDEX student_index (`student_id`)

上面的語句將創建一個帶有student_index名稱的普通索引。

創建唯一索引

ALTER TABLE `tbl_student` ADD UNIQUE student_unique_index (`student_id`)

在這里, student_unique_index是分配給 student_id 的索引名稱,並創建一個索引,其值必須是唯一的(這里可以接受 null)。

全文選項

ALTER TABLE `tbl_student` ADD FULLTEXT student_fulltext_index (`student_id`)

以上語句將使用student_fulltext_index創建全文索引名稱,為此您需要 MyISAM Mysql Engine。

如何刪除索引?

DROP INDEX `student_index` ON `tbl_student`

如何檢查可用索引?

SHOW INDEX FROM `tbl_student`

值得注意的是,多個字段索引可以極大地提高您的查詢性能。 所以在上面的例子中,我們假設 ProductID 是唯一要查找的字段,但是如果查詢說 ProductID = 1 AND Category = 7 那么多列索引會有所幫助。 這是通過以下方式實現的:

ALTER TABLE `table` ADD INDEX `index_name` (`col1`,`col2`)

此外,索引應與查詢字段的順序相匹配。 在我的擴展示例中,索引應該是 (ProductID,Category) 而不是相反。

你說你有一個索引,解釋說不是。 但是,如果你真的這樣做了,這就是繼續的方法:

如果列上有索引,而 MySQL 決定不使用它,可能是因為:

  1. 查詢中還有一個 MySQL 認為更適合使用的索引,它只能使用一個。 如果通常的檢索方法是按多於一列的值,則解決方案通常是跨多列的索引。
  2. MySQL 決定有很多匹配的行,並認為 tablescan 可能更快。 如果不是這種情況,有時ANALYZE TABLE會有所幫助。
  3. 在更復雜的查詢中,它決定不使用它基於查詢計划中極其智能的深思熟慮的伏都教,由於某種原因不符合您當前的要求。

在 (2) 或 (3) 的情況下,您可以通過索引提示 sytax 誘使MySQL 使用索引,但如果您這樣做,請確保運行一些測試以確定在您提示時使用索引是否確實提高了性能.

更好的選擇是在 CREATE TABLE 查詢期間直接添加約束(假設您有關於表的信息)

CREATE TABLE products(
    productId INT AUTO_INCREMENT PRIMARY KEY,
    productName varchar(100) not null,
    categoryId INT NOT NULL,
    CONSTRAINT fk_category
    FOREIGN KEY (categoryId) 
    REFERENCES categories(categoryId)
        ON UPDATE CASCADE
        ON DELETE CASCADE
) ENGINE=INNODB;

使用phpmyadmin ,MySQL 管理的好工具,包括索引

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM