几个常见的Mysql索引问题
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. 多列排序时使用索引的坑
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索引问题的更多相关文章
- MySQL索引类型总结和使用技巧以及注意事项
索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...
- mysql 索引分类
在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL的查询和运行更加高效.索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常 ...
- mysql 索引 详解
索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...
- 【转】MySQL索引和查询优化
原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/09/26/2704344.html 对于任何DBMS,索引都是进行优化的最主要的因素.对于少 ...
- MySQL索引及查询优化总结
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:谢庆玲 文章<MySQL查询分析>讲述了使用MySQL慢查询和explain命令来定位mys ...
- MySQL索引和查询优化
对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降. 如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅 ...
- mysql索引使用注意事项
索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...
- MySQL索引基本应用[转]
原文地址:http://www.php100.com/html/webkaifa/database/Mysql/2010/0409/4279.html 索引是快速搜索的关键.MySQL索引的建立对于M ...
- mysql进阶(二十六)MySQL 索引类型(初学者必看)
mysql进阶(二十六)MySQL 索引类型(初学者必看) 索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型. 在数 ...
随机推荐
- Java基础知识总结--final、finally、finalize的区别
谈谈final.finally.finalize的区别 1.final修饰符:如果一个类被声明为final,意味着这个类不能再被派生出新的子类,不能作为父类被别的类继承.因此,一个类不能即被声明为ab ...
- JAVA自学作业01
JAVA自学作业01 1.Hello World 程序 class HelloWorld{ public static void main(String args[]){ System.out.pri ...
- Unity游戏开发图片纹理压缩方案
Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设 ...
- Eclipse中jsp和html格式化自动排版问题
删除inline Elements 中所有的元素 http://m.codes51.com/article/detail_197472.html
- sql server ExecuteNonQuery()返回受影响行数不适用select语句
SqlCommand.ExecuteNonQuery 方法对连接执行 Transact-SQL 语句并返回受影响的行数. 对于 UPDATE.INSERT 和 DELETE 语句,返回值为该命令所影响 ...
- Gradle初识
一.安装配置 gradle官方网站https://gradle.org/,下载下来是一个压缩包,解压到合适的目录即可,然后配置环境变量(GRADLE_HOME,Path),略去. 二.IDEA配置 N ...
- iOS:给标签栏控制器的UITabbarItem添加点击动效
一.介绍 现在很多app,附带很炫的点击效果,让用户享受到非常棒的体验,例如动画.渐变.音效等. 当然,市面上大多数app的标签栏点击还是挺中规中矩的,只是切换图片而已.然而,这个是可以优化的,附带点 ...
- git关联远程仓库
git init git add . git commit -m "0.0.1 release" git remote -v git remote add master repos ...
- 【SQL 代码】SQL 语句记录(不定时更新)
1.数值四舍五入,小数点后保留2位 round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位. numeric 函数的2个参数,第一个表示数据 ...
- 【jQuery:遍历同样class的全部值,遍历某一列td的值】
jsp代码: Html代码 <c:forEach var="main" items="${mainPage.list }"> <tr> ...