在两列上按顺序优化简单的mysql查询

时间:2016-01-07 09:20:10

标签: mysql sql select sql-order-by query-optimization

我才开始对我的查询进行解释,看到类型是全部,我使用的是文件。

我不确定如何优化即使是最简单的查询,如果有人可以提供以下查询的指导,这些查询只是通过其名字主要和第二名称来检索用户和订单:

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

3 个答案:

答案 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

让我们分析您的查询。您已使用子句WHEREBlocked提取列value <> 1的值。改进此子句取决于Blocked列中值的数据分布。如果只有一小部分数据包含值

blocked <> 1

INDEX列上使用blocked会提高您的效果。在另一种情况下,INDEX对您没有帮助。

您还为表的每条记录使用了TRIM函数。如果你删除了它,你将提高性能。

当然,排序也会影响查询性能。