2017-07-17 71 views
-3

Hellow,wrold!從8.000.000行的數據庫表中增加「選擇」的方法?

我已閱讀關於在網絡中,但我還沒有找到合適的解決方案。我不是在SQL親,我有一個包含10列,8.000.000行和簡單的查詢(我用PHP工作)

SELECT `field_name_1`, `field_name_2`, `field_name_3` 
FROM `table_name` 
WHERE `some_field`=#here_is_an_integer# 
ORDER BY `some_field` 
LIMIT 10; 

也許有些索引,緩存,或者像這樣的簡單的表。

如果您對此有所瞭解,我會很樂意爲您提供幫助,或只是說我應該遵循的方式來找到解決方案。

謝謝!

+2

is some_field索引? – jarlh

+1

真正的問題是什麼?你是否試圖優化上述查詢的時間執行? 'some_field'必須有一個索引 –

+0

@jarlh,no,noone – Solembum

回答

0

也許你可以把你的問題形式化得更好一些(也許在某處使用問號)。不管怎麼說,如果你想提高單個表的選擇速度,比如你所描述的那個,那麼WHERE子句中涉及的列至少應該有一個合適的索引。這可能只是一個標準的'KEY(some_field)',如果它是一個整數類型的話,否則如果它是一個字符串(即varchar或varbinary)類型的字段,並且在第一個字節中有合理的基數,你可以使用前綴索引並執行類似'KEY(some_field(8))'的操作,並最小化索引大小(隨後通過減少btree搜索時間來提高性能)。

理想情況下,服務器將具有足夠的內存(並且如果您使用innodb,則具有足夠大的innodb_buffer_pool_size)以將上述索引保留在內存中。另請看https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_adaptive_hash_index ...如果您的服務器具有可用資源,並且您的應用程序具有數據訪問模式以證明其正確性。

希望這會有所幫助!

4

some_field上使用索引,並以所有使用SQL WHERE的列上的最佳方式使用索引。 如果你只是想顯示的數據,在SQL中使用分頁與LIMIT 而像管理員設置緩存和其他的Mysql(或MariaDB的)限制像在那裏(Top 20+ MySQL Best Practices

...簡單的答案,如果更好的搜索你有空間可用,從
MySQL> ALTER TABLE table_name ADD INDEX(some_field);

+0

請告訴我,什麼樣的索引? – Solembum

+0

您可以通過存儲數據的類型和表格的結構來選擇索引類型,請參閱:[索引說明](https://www.tutorialspoint.com/mysql/mysql-indexes.htm)唯一索引用於列其中2行不相同,這就是說,那麼你在大多數情況下使用正常的索引 –

1

這裏有一些事情要考慮:

  • 確保將加盟,WHERE或ORDER/GROUP BY有合適的索引(唯一或只是簡單的文本)
  • 隨着一個多行中的所有領域表中,服務器的內存緩存必須能夠存儲臨時結果集。
  • 將InnoDb用於較慢的插入和較快的選擇,並調諧InnoDb以便能夠存儲臨時結果集
  • 不要使用RAND()以便可以查詢緩存結果集。
  • 過早過濾;嘗試將條件放在JOIN ..和x = y上,而不是在最終的WHERE條件下(除非它是關於主表)。 (內部)以最優化的順序連接;例如,如果您有許多用戶和少量報表,請首先選擇用戶,然後在進行其他加入之前立即限制行數。