2016-01-07 50 views
0

我只是剛開始運行我的查詢解釋,並看到類型是所有,我正在使用filesort。優化簡單的mysql查詢,在兩列上排序

我不知道如何優化,即使是最簡單的查詢,如果任何人都可以在下面的查詢這只是主要他們的名字和第二名字其次檢索用戶和訂單提供指導:

SELECT UserID, TRIM(FName) AS FName, TRIM(SName) as SName, pic 
FROM users WHERE Blocked <> 1 
ORDER BY FName, SName 
LIMIT ?, 10 

表創建如下:

CREATE TABLE IF NOT EXISTS `users` (
`UserID` int(11) NOT NULL, 
    `FName` varchar(25) NOT NULL, 
    `SName` varchar(25) NOT NULL, 
    `Pword` varchar(50) NOT NULL, 
    `Longitude` double NOT NULL, 
    `Latitude` double NOT NULL, 
    `DateJoined` bigint(20) NOT NULL, 
    `Email` varchar(254) NOT NULL, 
    `NotificationID` varchar(256) NOT NULL, 
    `Pic` varchar(500) DEFAULT NULL, 
    `Radius` int(11) NOT NULL, 
    `ads` tinyint(1) NOT NULL, 
    `Type` varchar(5) NOT NULL, 
    `Blocked` tinyint(4) NOT NULL 
) ENGINE=MyISAM AUTO_INCREMENT=1469 DEFAULT CHARSET=latin1; 

解釋給出如下:

id : 1 
select_type : SIMPLE 
table : users 
type : ALL 
possible_keys : NULL 
key : NULL 
key_len : NULL 
ref : NULL 
rows : 1141 
Extra : Using where; Using filesort 
+0

在INSERT而不是SELECT上使用TRIM()會更加優化。所以它只是調用一次而不是每次都調用。 –

+0

也許下面的索引會幫助'改變表用戶添加索引block_fname_sname_idx(Blocked,FName,SName)' –

+0

@ôkio謝謝你將更新那部分! – user2363025

回答

2

添加索引(阻塞,FName參數,SNAME)
並改變在哪裏Blocked = 0,如果有可能

+0

這與改變我的TRIM發生在插入給我我需要的優化。感謝大家的答案,我現在更瞭解它 – user2363025

1

如果你想優化這個查詢,你可以通過用戶的數量創建在條件

CREATE INDEX id_users_blocked ON users (Blocked) ; 

優化依賴於該領域的指數withBlocked <> 1

如果這些都是一些不方面particolar改進..但在解釋你不shoudl看到所有。

您也可以在索引字段中添加fname,sname,但是對於某種方式使用trim以及字段pic的需要無法使該索引具有高性能..因爲如果firsta通常使用像trim不是從索引獲得,在第二個不是gooe索引與像字段像..所以在錶行的訪問是強制性的。

1
SELECT UserID, TRIM(FName) AS FName, TRIM(SName) as SName, pic 
FROM users WHERE Blocked <> 1 
ORDER BY FName, SName 
LIMIT ?, 10 

我們來分析一下您的查詢。您已使用第WHERE條提取value <> 1列的值Blocked。改進此條款取決於Blocked列中值的數據分佈。如果只是數據的很小一部分使用INDEXblocked列會給你的性能提高包含值

blocked <> 1 

。在另一種情況下,INDEX不會對你有所幫助。

您還使用TRIM函數爲您的表的每個記錄。如果你刪除它,你會提高性能。

當然,排序也會影響查詢性能。