我才开始对我的查询进行解释,看到类型是全部,我使用的是文件。
我不确定如何优化即使是最简单的查询,如果有人可以提供以下查询的指导,这些查询只是通过其名字主要和第二名称来检索用户和订单:
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 :(得分:2)
添加索引(已阻止,FName,SName)
如果有可能,请更改Blocked = 0
的位置
答案 1 :(得分:1)
如果要优化此查询,可以在条件
的字段上创建索引CREATE INDEX id_users_blocked ON users (Blocked) ;
优化取决于具有Blocked&lt;&gt;的用户数量1
如果这些很少,请不要进行特别改进..但在解释中你不要看到全部。
你也可以在索引字段中添加fname,sname但是使用trim作为一种方式并且字段pic的需要不能使这个索引具有高性能..因为如果firsta情况下通常具有类似trim的函数的字段是没有从索引获取,在第二个不是gooe一个像pic这样的字段的索引..所以表行的访问是强制性的。
答案 2 :(得分:1)
SELECT UserID, TRIM(FName) AS FName, TRIM(SName) as SName, pic
FROM users WHERE Blocked <> 1
ORDER BY FName, SName
LIMIT ?, 10
让我们分析您的查询。您已使用子句WHERE
以Blocked
提取列value <> 1
的值。改进此子句取决于Blocked
列中值的数据分布。如果只有一小部分数据包含值
blocked <> 1
在INDEX
列上使用blocked
会提高您的效果。在另一种情况下,INDEX
对您没有帮助。
您还为表的每条记录使用了TRIM
函数。如果你删除了它,你将提高性能。
当然,排序也会影响查询性能。