MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个不能利用索引完成DISTINCT操作的实例.

实例1 使用索引优化DISTINCT操作

create table m11 (a int, b int, c int, d int, primary key(a)) engine=INNODB;

insert into m11 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8);

explain select distinct(a) from m11;

mysql> explain select distinct(a) from m11;

+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| 1 | SIMPLE | m11 | NULL | index | PRIMARY | PRIMARY | 4 | NULL | 1 | 100.00 | Using index |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

说明:

1 'a'列上存在主键索引,MySQL可以利用索引(key列值表明使用了主键索引)完成了DISTINCT操作.

2 这是使用索引优化DISTINCT操作的典型实例.

实例2 使用索引不能优化DISTINCT操作

create table m31 (a int, b int, c int, d int, primary key(a)) engine=MEMORY;

insert into m31 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8);

explain select distinct(a) from m31;

mysql> explain select distinct(a) from m31;

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| 1 | SIMPLE | m31 | NULL | ALL | NULL | NULL | NULL | NULL | 8 | 100.00 | NULL |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

说明:

1 从查询执行计划看,索引没有被使用.

2 对比实例1的建表语句,只是存储引擎不同.

3 为什么主键索引没有起作用? 难道MEMORY存储引擎上的索引不可使用?

实例3 使用索引可以优化DISTINCT操作的Memory表

create table m33 (a int, b int, c int, d int, INDEX USING BTREE (a)) engine=MEMORY;

insert into m33 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8);

explain select distinct(a) from m33;

mysql> explain select distinct(a) from m33;

+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+| 1 | SIMPLE | m33 | NULL | index | NULL | a | 5 | NULL | 8 | 100.00 | NULL |+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+

说明:

1 'a'列上存在主键索引,MySQL可以利用索引(key列值表明使用了主键索引)完成了DISTINCT操作.

2 对比实例2,可以发现,二者都使用了Memory引擎. 但实例3指名使用Btree类型的索引.

3 实例2没有指定使用什么类型的索引,MySQL将采用默认值. MySQL手册上说:

As indicated by the engine name, MEMORY tables are stored in memory. They use hash indexes by default, which makes them very fast for single-value lookups, and very useful for creating temporary tables.

结论:

1 看索引对查询的影响,要注意索引的类型.

2 HASH索引适合等值查找,但不适合需要有序的场景,而Btree却适合有序的场景.

3 看查询执行计划,发现索引没有被使用,需要进一步考察索引的类型.

DISTINCT不能选择多个字段的解决方法在实际应用中,我们经常要选择数据库某表中重复数据,通常我们是使用DISTINCT函数。

但DISTINCT只能对一个字段有效,比如:

sql="select DISTINCT title from Table where id>0"

当我们需要列出数据中的另一列,比如:

sql="select DISTINCT title,posttime from Table where id>0"

得出的结果就不是我们想要的了,所以我们需要用另外的方法来解决这个问题。

下面的是我写的SQL语句,我不知道是不是很好,但愿有更好的人拿出来分享一下:

写法一:

sql = "Select DISTINCT(title),posttime From Table1 Where id>0"

写法二:

sql = "Select title,posttime From Table1 Where id>0 group by title,posttime"

写法三:

sql="select title,posttime from Table where id in (select min(id) from Table group by title)"

distinct多个字段mysql_MySQL中索引优化distinct语句及distinct的多字段操作相关推荐

  1. mysql中distinct走索引吗_MySQL中索引优化distinct语句及distinct的多字段操作

    MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用 ...

  2. 带时间锉字段查询不走索引优化记录!+数据库卡顿问题排查顺序

    近期解决了病历系统数据库卡顿的问题,以下为分析经过,本文重点为带时间锉字段的优化和数据库卡顿问题排查的思路! 郑州病历系统登录卡慢问题,初步看是体温单表(t_vital_signs)查询没走索引影响的 ...

  3. mysql in语句 索引,MySQL 中索引相关 SQL 语句

    索引是用来加快从数据库中查询数据的速度的. 需要注意的是索引的使用会增加插入和更新的时间,因为在插入数据的同时也会更新索引.所以在创建索引时确保只在那些频繁作为查询条件的列中增加. 创建索引 创建索引 ...

  4. 执行计划 分析一条sql语句的效率 mysql_MySQL中一条SQL语句的执行过程

    MySQL中一条SQL语句的执行过程 发布时间:2018-11-24 18:35, 浏览次数:390 , 标签: MySQL SQL 查询语句的执行顺序: 1.客户端通过TCP连接发送连接请求到mys ...

  5. sqlserver中索引优化

    背景: MRO表中TimeStamp nvarchar(32),但实际上它存储的内容是日期(2015-09-09 11:20:30). 现在我要执行这样一个sql语句: Select t10.* fr ...

  6. 实践中如何优化MySQL(精)

    需要查看更多的数据库相关的知识?点击这里 文章目录 一.SQL语句及索引的优化 SQL语句的优化 1. 尽量避免使用子查询 2. 用IN来替换OR 3. 读取适当的记录LIMIT M,N,而不要读多余 ...

  7. 22-08-25 MySQL高级(03)MySQL索引、索引演绎、适合加索引的情况、执行计划Explain各字段解释

    "系统,那如果我没有绑定,没有简化,我原先的人生最大的可能是怎么样的",李长生好奇一问.很快系统给出了答案. "如果宿主是小说主角的话,就活个几章" " ...

  8. mysql not in优化_实践中如何优化MySQL(收藏)

    SQL语句的优化: 1.尽量避免使用子查询 3.用IN来替换OR 4.LIKE前缀%号.双百分号._下划线查询非索引列或*无法使用到索引,如果查询的是索引列则可以 5.读取适当的记录LIMIT M,N ...

  9. Mysql索引优化实战一

    文章目录 一.示例表 一个不容易理解的综合例子: Mysql如何选择合适的索引 常见sql深入优化 Order by与Group by优化 优化总结: Using filesort文件排序原理详解 索 ...

最新文章

  1. 2021潍坊市高考成绩查询,潍坊2021高考成绩排名榜单,潍坊各高中高考成绩喜报
  2. 51nod1565 FFT
  3. 关于autorelease pool一个较好的理解
  4. 百度e-staff王路离职投身VC,曾负责市场公关,今年主导智慧城市
  5. ASP.NET Core 基础知识(十四)错误处理
  6. vue拦截器实现统一token,并兼容IE9验证
  7. Java基础学习总结(134)——JDK 11 是否值得更新的思考
  8. Python风格总结:列表List
  9. 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告
  10. 在内核中实现URL重定向
  11. Ubuntu删除用户和卸载服务命令
  12. 黑苹果E3-1290 v2(ivy bridge架构)安装成功案例分享
  13. PX4原生固件,position_estimator_inav解读
  14. c 语言程序设计复习,C语言程序设计复习题
  15. PHP Laravel 队列技巧:Fail、Retry 或者 Delay
  16. GTO、GTR、MOSFET和IGBT的区别及应用
  17. 人工智能在物联网项目中的应用
  18. 最近工作里遇到的一些问题,记录下来
  19. 备受关注的无人便利店代理前景如何?
  20. java null和空

热门文章

  1. jwt使用:往JwtBuilder中设置claims ,值被覆盖的问题
  2. 太阳能和光伏连接器-市场现状及未来发展趋势
  3. java的cloneable_关于Java cloneable
  4. 初试python爬虫(简单爬取站长之家第一页图片)
  5. 360 vs QQ, 谁会赢?
  6. 极坐标计算重积分交换积分次序
  7. 名称 “WORKGROUP:1d“ 不能注册到 IP 地址 192.168.99.185 的界面上。
  8. iis打不开默认的ie浏览器
  9. 机器学习系列2 机器学习的公平性
  10. python就业班百度云_2017python就业班百度云在线分享