【问题标题】:optimise simple mysql query with order by on two columns在两列上使用 order by 优化简单的 mysql 查询
【发布时间】:2016-04-11 14:50:57
【问题描述】:

我才刚刚开始对我的查询运行解释,发现类型是 All 并且我正在使用文件排序。

我不确定如何优化即使是最简单的查询,如果有人可以就以下查询提供指导,该查询主要按名字检索用户和订单,其次按姓氏检索:

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

【问题讨论】:

  • 在 INSERT 而不是 SELECT 上使用 TRIM() 会更优化。所以它只被调用一次,而不是每次。
  • 也许下面的索引会帮助alter table users add index block_fname_sname_idx(Blocked,FName,SName)
  • @ôkio 谢谢会更新那部分!
  • @AbhikChakraborty 谢谢,我试过了,但对解释的结果没有影响
  • 您似乎正在“通过偏移量进行分页”。这有问题,请参阅my blog

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


【解决方案1】:

添加索引(阻止、FName、SName)
如果可能的话,将位置更改为Blocked = 0

【讨论】:

  • 这与在插入时更改我的 TRIM 一起为我提供了我需要的优化。谢谢大家的回答,大家之间我现在更明白了
【解决方案2】:

如果你想优化这个查询,你可以在 where 条件下的字段上创建一个索引

CREATE INDEX id_users_blocked ON users (Blocked) ;

优化取决于阻塞的用户数 1

如果这些很少,请不要特别改进......但在解释中你不应该看到全部。

您也可以在索引字段中添加 fname、sname,但是使用 trim 作为一种方式和字段 pic 的需要不能使该索引具有高性能.. 因为如果第一种情况下通常具有类似 trim 功能的字段是not get from index and in the second is not gooe a index with a field like pic .. 所以对表行的访问是强制性的。

【讨论】:

    【解决方案3】:
    SELECT UserID, TRIM(FName) AS FName, TRIM(SName) as SName, pic
    FROM users WHERE Blocked <> 1
    ORDER BY FName, SName 
    LIMIT  ?, 10
    

    让我们分析您的查询。您已使用子句WHERE 提取列Blockedvalue &lt;&gt; 1 的值。改进此子句取决于Blocked 列中值的数据分布。如果只有一小部分数据包含值

    blocked <> 1
    

    blocked 列上使用INDEX 会提高性能。在另一种情况下,INDEX 对你没有帮助。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2011-05-13
      • 2012-06-12
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多