‘壹’ MYsql如何降序排列或如何加快降序查询的速度
MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。
MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。
通过索引优化来实现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;
特别提示:
1>mysql一次查询只能使用一个索引。如果要对多个字段使用索引,建立复合索引。
2>在ORDER BY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ryb7899/archive/2010/05/11/5580624.aspx
‘贰’ MySql 字段排序
select *
from sellrecord
order by convert(int,substring(listnumber,1,2)) asc,convert (int,substring(listnumber,4,len(listnumber)-2)) asc
‘叁’ mysql 增加排序 性能差很多 怎么优化
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;
‘肆’ sql in怎么根据in的顺序排列查询结果
按指定顺序输出数据,可以使用order by charindex(','+convert(varchar,ID)+',',',3,1,2,5,4,')的方法来实现这个目的
1
2
3
4
select id,title
from tbname
where id in (3,1,2,5,4)
order by charindex(','+convert(varchar,ID)+',',',3,1,2,5,4,')
‘伍’ mysql语句既要从大到小排列,又要随机获取怎么做的有谁遇到过吗
sql语句:select * from table_name where id=round(rand()*10) order by id desc limit 0,6
注:可以根据你id值的范围调节where条件中随机数值的范围。
这是最简单的方式,不过这个方法可能存在一个问题,就是产生的随机数可能重复,比如随机数出现2次或多次数字3,这样结果中就会有重复的记录。通过sql语句本身如何解决这个问题暂时没想到,这样就只能用另一种方法:先在程序中生成6个不重复的随机数(具体操作比如每个随机数生成出来保存之前先跟之前的所有数比较一下,不重复才保存,重复就重新生成一个),然后再生成sql语句:select * from table_name where id in (1,2,3,4,5,6) order by id desc ;
‘陆’ mysql数据库怎么可以两个条件排序
可以的,order by多个字段规则是这样的,用逗号分隔每一个字段,如果字段不指明排序方式,默认是增序。排序的方法是先按第一个字段排序,如果有相同的再按后续的字段依次排序。
举个例子
‘柒’ mysql如何实现对group by后的条目进行排序
group by 和 order by 不能同时使用 我没有看你的sql写的对不对 在你的基础上稍加修改 :
select * from (
select name,count(distinct name) as number from useTable group by name
) as tmp order by number desc
‘捌’ mysql 查询结果按照字母排序
数据库排序只能按字典序来排序,汉字不能用字典序排序。
你可以加个字段存拼音或者加个字段存一个int(代表次序)
‘玖’ mysql怎么按 in 里面 id 的顺序排列
表结构如下:
mysql> select * from test;
+----+-------+
| id | name |
+----+-------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
| 4 | test4 |
| 5 | test5 |
+----+-------+
执行以下SQL:
mysql> select * from test where id in(3,1,5);
+----+-------+
| id | name |
+----+-------+
| 1 | test1 |
| 3 | test3 |
| 5 | test5 |
+----+-------+
3 rows in set (0.00 sec)
这个select在mysql中得结果会自动按照id升序排列,
但是我想执行"select * from test where id in(3,1,5);"的结果按照in中得条件排序,即:3,1,5,
想得到的结果如下:
id name
3 test3
1 test1
5 test5
请问在这样的SQL在Mysql中怎么写?
网上查到sqlserver中可以用order by charindex解决,但是没看到Mysql怎么解决??请高手帮忙,谢
谢!
select * from a order by substring_index('3,1,2',id,1);
‘拾’ mysql默认排序问题
参考mysql官方的回答:
当你的表示myisam时:
SELECT * FROM tbl -- this will do a "table scan". If the table has never had any DELETEs/REPLACEs/UPDATEs, the records will happen to be in the insertion order, hence what you observed.
大致意思为,一个myisam引擎表在没有任何的删除,修改操作下,执行 select 不带order by,那么会按照插入顺序进行排序。
If you had done the same statement with an InnoDB table, they would have been delivered in PRIMARY KEY order, not INSERT order. Again, this is an artifact of the underlying implementation, not something to depend on.
对于innodb引擎表来说,在相同的情况下,select 不带order by,会根据主键来排序,从小到大