2015-10-16 79 views
0

使我的概念更加清晰,關於Mysql中的索引。我知道的是索引是用來使你的查詢更快。除了我有幾個問題需要了解。如何在mysql中使用索引以及使用哪些參數

比方說,我有一個查詢:

SELECT books.name, books.name2, books.id, books.image, books.faith, books.topic, books.downloaded, books.viewed, books.language, books.size, books.author as author_id, authors.name as author_name, authors.aid from books LEFT JOIN authors ON books.author = authors.aid WHERE books.id = '".$id."' AND status = 1 
  1. 是任何指標適用於本select查詢,同時它具有JOIN
  2. 在對列查詢進行索引後,會優化 或更改?
  3. 如何爲此查詢製作索引並針對哪一列?
  4. 使用索引的其他好處或缺點是什麼?
  5. 在哪些情況下應該避免索引,哪些應該使用索引 更多?
  6. 索引是否適用於隨機查詢?
  7. 索引在IDS上效率更高嗎?

請通知,謝謝您的提前!

+0

請通過[link1](http://stackoverflow.com/questions/3049283/mysql-indexes-what-are-the-best-practices),[link2](http://stackoverflow.com/questions/3567981/how-do-mysql-indexes-work) –

+0

[Cookbook on building an index](http://mysql.rjweb.org/doc.php/index_cookbook_mysql)。 –

回答

1

您可以查看以下鏈接的詳細信息。

https://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

http://mydbsolutions.in/query-optimization-2/

你的查詢是這裏 -

  1. 是任何指數適用於這個選擇查詢,同時它已加入?

這將取決於各種因素,如你的桌子有非常少的數據或約。在索引列中有70%的數據是相同的,那麼mysql會傾向於掃描表而不是索引。簡單地說,所有的連接列都應該被編入索引(如果你使用外鍵概念,你應該對它們進行索引編制索引)。同樣在你的查詢所在的列上過濾大多數數據,該字段應該被索引。在你的情況下,你正在過濾books.id中的數據,它應該是已經編入索引的主鍵。

  1. 對列查詢的索引進行優化或更改之後?

它會自動開始使用索引,但在某些情況下可能需要更改查詢。假設您使用的過濾條件爲"date(order_date)='2015-10-15'",即使在order_date上創建索引後也不會使用它,因此如果您的order_date列數據類型爲datetime or timestamp,則必須將您的查詢更改爲"order_date>='2015-10-15 00:00:00' and order_date<='2015-10-15 23:59:59'"

  1. 如何爲此查詢製作索引並針對哪個列?

在這裏,我沒有看到任何需要做索引,因爲您的條件是書籍表主鍵,它將已經索引。

  1. 使用索引的其他好處或缺點是什麼?

如果你盲目地創建索引,那麼在記錄插入/更新等時,每次索引都會被更新並且會使進程變慢。即使重指數也會表現緩慢。也會消耗更多的磁盤空間。

  1. 在哪種情況下應該避免索引,哪些地方應該使用更多索引?

如果有超過70%的數據是相同的任何字段則沒有必要在其上創建索引一樣status or is_deleted類型列作爲主要數據將被激活。

  1. 索引是否適用於隨機查詢?

是索引在隨機查詢上工作,對於可重複查詢,您可以使用query cache這將會更有效。

  1. 索引在IDS上的效率更高嗎?

是的。

相關問題