MySQL ORDER BY排序语句用法与优化

MySQL Order By语法

 代码如下 复制代码

 SELECT column_name(s) FROM table_name ORDER BY column_name

注意:SQL语句是“字母大小写不敏感”的语句(它不区分字母的大小写),即:“ORDER BY”和“order by”是一样的。

MySQL Order By案例

下面的例子:从“Person”表中选取所有记录,并将“Age”列进行分类:

 代码如下 复制代码
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("my_db", $con);
$result = mysql_query("SELECT * FROM person ORDER BY age");
while($row = mysql_fetch_array($result))
  {
  echo $row['FirstName']
  echo " " . $row['LastName'];
  echo " " . $row['Age'];
  echo "<br />";
  }
mysql_close($con);
?>

上面的代码将输出下面的结果:

  Glenn Quagmire 33

  Peter Griffin 35

按照升序或者降序进行分类排列

如果你使用了“ORDER BY”关键词,所有记录将按照默认的升序进行排列(即:从1到9,从a到z)

使用“DESC”关键词可以制定所有的数据按照降序排列(即:从9到1,从z到a):

双击代码全选 123 SELECT column_name(s) FROM table_name ORDER BY column_name DESC

MySQL Order By根据两列进行分类

很多时候,我们需要同时根据两列内容(或者更多列)来对数据进行分类。当指定的列数多于一列时,仅在第一列的值完全相同时才参考第二列:

双击代码全选 123 SELECT column_name(s) FROM table_name ORDER BY column_name1, column_name2

通过索引优化来实现MySQL的ORDER BY语句优化:

1、ORDER BY的索引优化。如果一个SQL语句形如:

 代码如下 复制代码

SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];

在[sort]这个栏位上建立索引就可以实现利用索引进行order by 优化。
2、WHERE + ORDER BY的索引优化,形如:

SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort];
建立一个联合索引(columnX,sort)来实现order by 优化。

注意:如果columnX对应多个值,如下面语句就无法利用索引来实现order by的优化

 代码如下 复制代码

SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] IN ([value1],[value2],…) ORDER BY[sort];

3、WHERE+ 多个字段ORDER BY

 代码如下 复制代码

SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;

建立索引(uid,x,y)实现order by的优化,比建立(x,y,uid)索引效果要好得多。

MySQL Order By不能使用索引来优化排序的情况

* 对不同的索引键做 ORDER BY :(key1,key2分别建立索引)

 代码如下 复制代码

SELECT * FROM t1 ORDER BY key1, key2;

* 在非连续的索引键部分上做 ORDER BY:(key_part1,key_part2建立联合索引;key2建立索引)

 代码如下 复制代码

SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

* 同时使用了 ASC 和 DESC:(key_part1,key_part2建立联合索引)

 代码如下 复制代码

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

* 用于搜索记录的索引键和做 ORDER BY 的不是同一个:(key1,key2分别建立索引)

 代码如下 复制代码

SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

* 如果在WHERE和ORDER BY的栏位上应用表达式(函数)时,则无法利用索引来实现order by的优化

 代码如下 复制代码

SELECT * FROM t1 ORDER BY YEAR(logindate) LIMIT 0,10;

特别提示:

>mysql一次查询只能使用一个索引。如果要对多个字段使用索引,建立复合索引。

>越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。
>简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。
>尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
>在ORDER BY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。

时间: 2024-09-01 16:16:03

MySQL ORDER BY排序语句用法与优化的相关文章

MySQL Order by 语句用法与优化详解_Mysql

MySQL Order By keyword是用来给记录中的数据进行分类的.MySQL Order By Keyword根据关键词分类ORDER BY keyword是用来给记录中的数据进行分类的. 复制代码 代码如下: SELECT column_name(s) FROM table_name ORDER BY column_name 例子 SQL创建代码: 复制代码 代码如下: CREATE TABLE IF NOT EXISTS mysql_order_by_test (  uid int

MySQL Order by 语句用法与优化详解

MySQL Order By keyword是用来给记录中的数据进行分类的. MySQL Order By Keyword根据关键词分类 ORDER BY keyword是用来给记录中的数据进行分类的.  代码如下 复制代码 SELECT column_name(s) FROM table_name ORDER BY column_name 例子 SQL创建代码:  代码如下 复制代码 CREATE TABLE IF NOT EXISTS mysql_order_by_test (   uid

MYSQL order by排序与索引关系总结

我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的B-Tree索引.其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引.当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等. MySQL InnoDB B-Tree索引使用Tips 这里主要讨论一下InnoDB B-Tree索引的使用,不提设计,只管使用.B-Tree索引主要作用于WHERE和ORDER BY子句.这里讨论的均在MySQL-Server-5.1.42测试

mysql SELECT FOR UPDATE 语句用法详解

以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE 这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commit)后才会执行.而主要的不同在于LOCK IN SHARE MODE 在有一方事务要Update

MySQL存储过程LOOP循环语句用法

MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体介绍了. 今天我们先来看看LOOP循环 mysql教程> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc()     -> BEGIN     ->     ->     DECLARE i int;

mysql中TRUNCATE TABLE 语句用法详解

TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. 语法    TRUNCATE TABLE name; 参数    name(是要截断的表的名称或要删除其全部行的表的名称) TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少. DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项.TRUNCATE TABLE

Mysql中SELECT INTO 语句用法详解

语法介绍:  把所有的列插入新表    代码如下 复制代码 SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename  只把希望的列插入新表    代码如下 复制代码 SELECT column_name1, column_name2 INTO new_table_name [IN externaldatabase] FROM old_tablename    实例1:制作 "Persons" 表的备份文

mysql索引提高优化order by语句用法介绍

先我们要注意一下 1>mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. 2>在ORDER BY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引. 关于索引一些说法 MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通过索引优化来实现MySQL的ORDER BY语句优化: 1.ORDER BY的索引

mysql中order by 语句的用法 索引优化

MySQL Order By keyword是用来给记录中的数据进行分类的. MySQL Order By Keyword根据关键词分类 ORDER BY keyword是用来给记录中的数据进行分类的. MySQL Order By语法  代码如下 复制代码 SELECT column_name(s) FROM table_name ORDER BY column_name 注意:SQL语句是"字母大小写不敏感"的语句(它不区分字母的大小写),即:"ORDER BY"