1. 选择性较低的列是否适合加索引?

索引选择性等于列中不重复(distinct)的行数量(也叫基数),与记录总数的比值。范围在0-1之间。数值越大,索引越快。

例如主键是唯一的,不重复的,所以选择性=1。

常见的选择性较低的列,例如是否热门,要不1,要不0。选择性等于2/记录总数,所以是非常低的。

而这种列适合加索引吗?

答案是要区分看待:

假如表中是否热门is_hot=1的行有100行,is_hot=0的行有100w行。

那么

如果需求是查询is_hot=1的行,我们设置索引idx(is_hot)是有用的

如果需求是查询is_hot=0的行,我们设置索引就没什么用了。

测试:

100w的表,type=1的有11行,其他都是type=2

没有设置type索引,搜索type=1,要检索100w行,也就是全表扫描,用时0.7s

加了type索引,搜索type=1,只要检索11行,用时0.04。搜索type=2,也是要检索100w行,用时0.7s,也是差不多全部扫描

2.Mysql的索引是否会自动加上主键

假如ID是主键,索引a(SongType)和索引b(SongType,ID)是否等价,也就是Mysql是否会为索引加上主键ID?

答案是不会的

测试:

有100w数据,前50w SongType=1,后49w SongType是2,最后1w SongTYpe=1,ID是主键

有索引a(SongType) 。

sql :select * from table where id>500000 and SongType=1

会使用主键索引,需要检索行50w行。用时0.5s

加索引b(SongType,ID)后,会使用索引b,只需要扫描1w行数据。用时0.02s

所以索引a,并不会包含主键

3. 多列排序时使用索引的坑

mysql文档

A key_part specification can end with ASC or DESC. These keywords are permitted for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order.

根据Mysql文档的说明,创建索引的时候,可以加上asc或者desc,例如:add index idx(a asc,b desc).但是实际Mysql是会忽略的(好坑。。。)好像8.0版本之后支持desc了。

这会有什么影响呢?

假如有列test1和test2,都是int类型。

我们创建索引``idx1 (test1,test2)

假如我们要按test1和test2排序,例如SQL

explain select * from table order by test1 ,test2 limit 1;

可以使用索引的排序:

  • order by test1
  • order by test1 desc
  • order by test1,test2
  • order by test1 desc,test2 desc

不可以使用索引的排序:

  • order by test1,test2,desc
  • order by test1 desc,test2

因为索引不支持desc,所以多列的索引是按全部列的升序存储的。所以只排序一列,全部列升序,全部列降序,都能用索引。但是第一列用升序,第二列用降序,或者第一列降序,第二列用升级,都不能使用索引。

未经同意,请不要转发

几个常见的Mysql索引问题的更多相关文章

  1. MySQL索引类型总结和使用技巧以及注意事项

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...

  2. mysql 索引分类

    在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL的查询和运行更加高效.索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常 ...

  3. mysql 索引 详解

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...

  4. 【转】MySQL索引和查询优化

    原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/09/26/2704344.html 对于任何DBMS,索引都是进行优化的最主要的因素.对于少 ...

  5. MySQL索引及查询优化总结

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:谢庆玲 文章<MySQL查询分析>讲述了使用MySQL慢查询和explain命令来定位mys ...

  6. MySQL索引和查询优化

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降. 如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅 ...

  7. mysql索引使用注意事项

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...

  8. MySQL索引基本应用[转]

    原文地址:http://www.php100.com/html/webkaifa/database/Mysql/2010/0409/4279.html 索引是快速搜索的关键.MySQL索引的建立对于M ...

  9. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

随机推荐

  1. yii2 配合bootstrap添加一个气泡

    添加一个气泡 1.bootstrap 官网:http://getbootstrap.com/ 2.bootstrap 中文官网:http://v3.bootcss.com/ 添加气泡主要需要用到 bo ...

  2. mysql5.7.20完全卸载 win10

    试了好多方法,搞了很久终于完全卸载干净,重装完成了! 1.关闭服务 以管理员身份运行cmd,执行以下命令: C:\WINDOWS\system32>net stop mysql MySQL 服务 ...

  3. hadoop实现倒排索引

    hadoop实现倒排索引 本文用hadoop实现倒排索引算法,用基本的分两步完成,不使用combine 第一步 读入文档,统计文档中各个单词的个数,与word count类似,但这里把word-fil ...

  4. 线段树模板hdu 1754:I Hate It

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. sql基本查询语句

    查询语句的五中字句:where(条件查询),having(筛选),group by(分组),order by(排序),Limit(限制结果数) 一 单表查询 1.查询指定列:select 列名 fro ...

  6. JSAP103

    JSAP103 1.节点 1)定义:不是元素,节点是页面中的所有内容(标签,属性,文本),Node.它使得任何标签中的元素获取都十分方便 2)节点的相关属性 可以使用标签即元素点出来,可以使用属性节点 ...

  7. Spring(2)—IOC

    一.Spring IOC是什么 1.简述 Spring是一个开源框架 Spring为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能 Spring是 ...

  8. 宿主机系统 Deepin 15.4,解决 Virtualbox 5.1 中 XP虚拟机无法使用 USB设备(如:U盘、罗技优联接收器等)的问题

    软件环境 宿主机系统:Deepin 15.4.1, 虚拟机软件:VirtualBox 5.1 虚拟机系统:XP 操作步骤如下: (1)  安装 Virtualbox Extension Pack 进入 ...

  9. mycat 资料汇总

    1. mycat 官网http://www.mycat.io/ 2. mycat 官博:http://blog.csdn.net/zhxdick/article/category/6086991/1 ...

  10. Unity 5.4版本 Application.systemLanguage 失效

    最近在上线双语版本(一个包支持中文.英文二种语言)时,遇到一个坑点 if (ToolUtils.isAndroid()) { if (Application.systemLanguage == Sys ...