当我们想要通过asc和desc订购时,我知道一个通​​过查询更快地进行排序的技巧.

对于整数存储否定值.

因此,如果我存储-7,-11,-8,-5,-1,-2,则asc的顺序将给出-11,-8,-7,5,-2,-1,因此实际的行将是按该列排序desc(例如,如果我显示非否定版本).

问题:如何在字符串中使用此技巧?

如何将字符串“否定”或反转,以便该字符串也适用于字符串列?

更新

MySQL无法使用索引进行类型的查询:

ORDER BY col1 ASC col2 DESC

如果我想要下降的列是一个整数,我可以存储否定值并执行以下查询:

ORDER BY col1 ASC col2 ASC

在这种情况下,可以使用索引,实际上由于否定-11,-8,-7,5,-2,-1升序,我将按降序获取值,但是如果删除否定则是降序.

我的问题是我不清楚如何将这种方法应用于字符串列.我可以以某种方式获得字符串的算术值吗?

解决方法:

虽然CREATE INDEX的语法支持将索引定义为升序或降序的选项,但在最常见的两个存储引擎(InnoDB和MyISAM)中,此索引选项是无操作.没有“升序”或“降序”索引,它们只是索引,可以用于任何方向的排序.

但是在你描述的情况下,你有一个多列索引,你想按一列升序排序而另一列降序,这是一个不同的故事.如果列使用索引,则排序顺序必须在两个列的相同方向上.

(并不是说每种方法都必须使用索引.您当然可以运行查询并让它使用filesort对匹配的行进行排序.)

但是您必须使用新的排序规则来存储字符串,并重建索引.该索引仅对反向排序有用.

来自@Cratylus的评论:

整理是将“A”定义为在“B”之前以及所有其他字母顺序.因此,如果您定义一个表示“B”在“A”之前的排序规则,并在列定义中使用该排序规则,那么对该列进行排序或在列上创建索引将采用相反的顺序.

注意:以下内容不会创建正确的排序规则,它只是演示了创建排序规则的步骤.

>编辑/usr/share/mysql/charsets/Index.xml并进行此编辑:

. . . leave other collations alone . . .

Dutch

English

French

German Duden

Italian

Latin

Portuguese

Spanish

>编辑/usr/share/mysql/charsets/latin1.xml并进行此编辑:

. . . leave other collations alone . . .

AE B1 AC A2 A0 9E 9C 8D BE 8B 89 87 85 83 7F 59

73 71 6F 6D 63 61 5F 5D 55 4F 4D 4B 49 47 45 43

97 B1 AC A2 A0 9E 9C 8D BD 8B 89 87 85 83 7F 59

73 71 6F 6D 63 61 5F 5D 55 4F 4D 4B 49 47 45 43

FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0

EF EE ED EC EB EA E9 E8 E7 E6 E5 E4 E3 E2 E1 E0

DF DE DD DC DB DA D9 D8 D7 D6 D5 D4 D3 D2 D1 D0

CF CE CD CC CB CA C9 C8 C7 C6 C5 C4 C3 C2 C1 C0

BF BC BB BA B9 AF AA A8 A6 A4 9A 98 95 93 91 8F

81 7D 7B 79 77 75 6B 69 67 65 5B 57 53 51 41 B8

B7 B6 B5 B4 B3 AF AA A8 A6 A4 9A 98 95 93 91 8F

81 7D 7B 79 77 75 6B 69 67 65 5B 57 53 51 41 40

3F 3E 3D 3C 3B 3A 39 38 37 36 35 34 33 32 31 30

2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21 20

1F 1E 1D 1C 1B 1A 19 18 17 16 15 14 13 12 11 10

0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00

. . .

>重启mysqld.

>确认您有新的排序规则:

mysql> SHOW COLLATION LIKE 'latin1%';

+---------------------+---------+-----+---------+----------+---------+

| Collation | Charset | Id | Default | Compiled | Sortlen |

+---------------------+---------+-----+---------+----------+---------+

. . .

| latin1_general_ci | latin1 | 48 | | Yes | 1 |

| latin1_general_cs | latin1 | 49 | | Yes | 1 |

| latin1_spanish_ci | latin1 | 94 | | Yes | 1 |

| latin1_reverse_ci | latin1 | 251 | | | 0 |

. . .

>创建一个表并用一些文本填充它:

mysql> CREATE TABLE foo (

id INT AUTO_INCREMENT PRIMARY KEY,

t VARCHAR(60) COLLATE latin1_reverse_ci,

x DATE,

KEY(t)

);

mysql> INSERT INTO foo (t) VALUES ('Harry'), ('Ron'), ('Hermione');

>证明排序顺序与您认为应该是的相反:

mysql> SELECT * FROM foo ORDER BY t ASC;

+----+----------+------+

| id | t | x |

+----+----------+------+

| 2 | Ron | NULL |

| 3 | Hermione | NULL |

| 1 | Harry | NULL |

+----+----------+------+

>确认它不使用filesort:

mysql> EXPLAIN SELECT * FROM foo WHERE t LIKE 'H%' ORDER BY t\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: foo

partitions: NULL

type: range

possible_keys: t

key: t

key_len: 63

ref: NULL

rows: 2

filtered: 100.00

Extra: Using index condition

我不得不在行上添加条件,因为否则它会认为它将读取表中的所有行,并且它执行了表扫描和文件输出.

来自@ypercube的评论:

它不会像REVERSE()那样反转给定字符串中字符的顺序,它会在比较两个字符串时反转哪些字符被认为大于或小于彼此.所以不,CHAR填充空格无关紧要,它们仍然在两个字符串的末尾.

示例(这次没有索引,仅使用顺序):

mysql> create table t (c char(20) collate latin1_reverse_ci);

mysql> insert into t values ('A'), ('B'), ('C');

mysql> select * from t order by c;

+------+

| c |

+------+

| C |

| B |

| A |

+------+

编辑:不,@ yycube是正确的,这对CHAR不起作用,因为空格字符位于错误的位置,当我简单地通过将所有字节按相反的顺序重新排序来重新排序整理.这不是设计校对的正确方法.

所以这个答案应该作为创建整理的机制的演示,而不是作为逆转字母顺序的正确整理.

标签:mysql,string,index,order-by

来源: https://codeday.me/bug/20190806/1597399.html

mysql asc_mysql – 在字符串列上使用asc和desc的索引相关推荐

  1. MySQL——高阶语句(上)

    MySQL高阶语句(上) 一.MySQL高级语句 1.ORDER BY----按关键字排序 单字段排序 多字段排序 2.OR/AND----或/且 3.DISTINCT----查询不重复记录 4.GR ...

  2. Mysql数据库(七)——mysql高阶语句(上)

    Mysql数据库(七)--mysql高阶语句(上) 一.按关键字排序 1.单字段排序 2.多字段排序 二.或/且的运用 三.查询不重复记录 四.对结果进行分组 五.限制结果条目 六.设置别名 使用场景 ...

  3. mysql 获取下一条记录数,如何在MySQL中查询当前数据上一条和下一条的记录

    如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from tab ...

  4. 把mysql 中的字符gb2312 改为gbk的方法

    第一步:查找mysql的字符: mysql> show variables like '%char%'; +--------------------------+---------------- ...

  5. MySQL Workbench/SQLyog 高分辨率屏幕上界面模糊的解决方法

    MySQL Workbench/SQLyog 高分辨率屏幕上界面模糊的解决方法 参考文章: (1)MySQL Workbench/SQLyog 高分辨率屏幕上界面模糊的解决方法 (2)https:// ...

  6. mysql 导出gbk_把mysql 中的字符gb2312 改为gbk的方法

    第一步:查找mysql的字符: mysql> show variables like '%char%'; +--------------------------+---------------- ...

  7. php过滤数据库就报错,php过滤掉emoji等无法存入MySQL数据库的字符简单示例

    这篇文章主要为大家详细介绍了php过滤掉emoji等无法存入MySQL数据库的字符简单示例,具有一定的参考价值,可以用来参考一下. 对php过滤掉emoji等无法存入MySQL数据库的字符简单示例感兴 ...

  8. mysql主从同步从库上Slave_IO_Running: Connecting问题

    mysql主从同步从库上Slave_IO_Running: Connecting问题 一.在做主从同步时遇到的问题 数据库主从问题从库上Slave_IO_Running: Connecting 在做m ...

  9. linux+nginx+mysql+php系统修改文件上传大小限制

    linux+nginx+mysql+php系统修改文件上传大小限制 对于LNMP框架的一些网站,上传文件大小会受到多个方面的限制,一个是nginx本身的限制,限制了客户端上传文件的大小,会报错&quo ...

  10. centos akonadi mysql,MySQL数据库之在CentOS7上安装MySQL5.7

    本文主要向大家介绍了MySQL数据库之在CentOS7上安装MySQL5.7 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 获取RPM包 # wget https://dev. ...

最新文章

  1. python合并k个有序链表_Leetcode合并K个升序链表(Python版本),LeetCode,python
  2. pdb+ipdb 调试 Python代码
  3. 《代码敲不队》第五次作业:项目需求分析改进与系统设计
  4. android 模仿大众点评团购卷列表多余3条时折叠,点击时显示剩余全部的功能
  5. 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “插件包“ 中的 Element[] dexElements )
  6. QT连接Postgresql数据库
  7. AcWing之从尾到头打印链表
  8. CSS word-wrap强制换行截断长字符串
  9. python所有软件-太牛逼!一款软件几乎可以操作所有的数据库!
  10. 北京交通大学离散数学 谓词逻辑_离散数学_北京交通大学_中国大学MOOC(慕课)
  11. 使用影子系统后win10导致的蓝屏解决办法
  12. 8421码 BCD码
  13. 联想小新一键恢复小孔_联想一键恢复系统怎么用?小新Air 13 Pro怎么还原操作系统?...
  14. PHP实现短网址还原
  15. 洛谷 P4147 玉蟾宫【悬线法/单调栈】
  16. html 弹出复选框,js点击文本框弹出可选择的checkbox复选框
  17. Jmeter接口测试中参数化的多种方法,你知道的有几种?欢迎评论留言。
  18. 怎么装win7与linux双,装双系统win7和linux_win7与linux双系统
  19. MSYS2 环境搭建
  20. Gunner(map)

热门文章

  1. 2021-5-17:Spring Boot整合Redis
  2. 微信第三方平台服务商各种坑必读(有问必答)授权事件接收配置,消息与事件接收配置
  3. python3 调用http接口例子
  4. php挂马攻击,PHP批量挂马脚本
  5. 设置QQ空间评论回复权限,包括日志、相册、说说、留言板的评论回复和留言权限,限制名单成员无评论回复权限
  6. 如何用js实现数组倒序输出
  7. 洛谷P1512 伊甸园日历游戏
  8. 离散数学程序实现——求关系矩阵的自反和对称闭包——c
  9. 边缘计算研究热点地图
  10. 加速数据无限超高速空间免费虚拟主机无限大小 支持SSL