mysql select不走索引_避免写出不走索引的SQL, MySQL
在MySQL中,并不是你建立了索引,并且你在SQL中使用到了该列,MySQL就肯定会使用到那些索引的,有一些情况很可能在你不知不觉中,你就“成功的避开了”MySQL的所有索引。
现假设有t_stu表,age,sname上建立了索引
索引列参与计算
如果where条件中age列中使用了计算,则不会使用该索引
SELECT `sname` FROM `t_stu` WHERE `age`=20;-- 会使用索引
SELECT `sname` FROM `t_stu` WHERE `age`+10=30;-- 不会使用索引!!因为所有索引列参与了计算
SELECT `sname` FROM `t_stu` WHERE `age`=30-10;-- 会使用索引
故,如果需要计算,千万不要计算到索引列,想方设法让其计算到表达式的另一边去。
索引列使用了函数
同样的道理,索引列使用了函数,一样会导致相同的后果
SELECT `sname` FROM `stu` WHERE concat(`sname`,'abc') ='Jaskeyabc'; -- 不会使用索引,因为使用了函数运算,原理与上面相同
SELECT `sname` FROM `stu` WHERE `sname` =concat('Jaskey','abc'); -- 会使用索引
索引列使用了Like %XXX
SELECT * FROM `houdunwang` WHERE `uname` LIKE '前缀就走索引%' -- 走索引
SELECT * FROM `houdunwang` WHERE `uname` LIKE '后缀不走索引%' -- 不走索引
所以当需要搜索email列中.com结尾的字符串而email上希望走索引时候,可以考虑数据库存储一个反向的内容reverse_email
SELECT * FROM `table` WHERE `reverse_email` LIKE REVERSE('%.com'); -- 走索引
注:以上如果你使用REVERSE(email) = REVERSE('%.com'),一样得不到你想要的结果,因为你在索引列email列上使用了函数,MySQL不会使用该列索引
同样的,索引列上使用正则表达式也不会走索引。
字符串列与数字直接比较
这是一个坑,假设有一张表,里面的a列是一个字符char类型,且a上建立了索引,你用它与数字类型做比较判断的话:
CREATE TABLE `t1` (`a` char(10));
SELECT * FROM `t1` WHERE `a`='1' -- 走索引
SELECT * FROM `t2` WHERE `a`=1 -- 字符串和数字比较,不走索引!
但是如果那个表那个列是一个数字类型,拿来和字符类型的做比较,则不会影响到使用索引
CREATE TABLE `t2` (`b` int);
SELECT * FROM `t2` WHERE `b`='1' -- 虽然b是数字类型,和'1'比较依然走索引
但是,无论如何,这种额外的隐式类型转换都是开销,而且由于有字符和数字比就不走索引的情况,故建议避免一切隐式类型转换
尽量避免 OR 操作
select * from dept where dname='jaskey' or loc='bj' or deptno=45 --如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引
所以除非每个列都建立了索引,否则不建议使用OR,在多列OR中,可以考虑用UNION 替换
select * from dept where dname='jaskey' union
select * from dept where loc='bj' union
select * from dept where deptno=45
mysql select不走索引_避免写出不走索引的SQL, MySQL相关推荐
- mysql select 补空行_用前一行的值填充空行mysql
/*如表中不包含任何主柱或標識列,因此不能決定哪些值是以前的值.這將是隨機的. 上面設置的值很小,這就是爲什麼下面的查詢不會有任何問題. 如果是較大的,然後繼續前進,把標識列和 更換標識列行號列的查詢 ...
- mysql select内部原理_数据库SQL SELECT查询的工作原理
作为Web开发人员,虽并非专业的DBA,但我们总是离不开数据库.一般开发员只会应用SQL的四条经典语句:select,insert,delete,update.以至于从来没有研究过它们的工作原理,在这 ...
- 在Oracle中写出性能优良的SQL语句
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器 ...
- mysql离散查询_如何写出高性能的MySQL查询
作者:会写代码的猪 发布时间:December 25, 2009 分类:猪在写代码 想写这样一篇文章很久了,但始终没有下手.最近帮同事看了几个查询,而且自己也在考虑一个索引系统的问题,所以今天就把这个 ...
- mysql 强制使用索引_快速找出MySQL数据库冗余索引和未使用索引
冗余索引和未使用索引的危害 随着上线的业务越来越多,在MySQL数据库中建的表也会越来越多,为提高查询访问速度,会创建相应的索引.但是由于技术人员的水平参差不齐,业务下线,代码逻辑变更等原因,导致线上 ...
- mysql做kv数据库_从零开始写KV数据库:基于哈希索引
前言 新的KV数据库层出不穷,我们经常听说的KV数据库如RocksDb.Hbase等都是基于日志结构的存储引擎.最近我在看<数据密集型应用系统设计>,里面有一章专门在讲日志结构的存储引擎的 ...
- mysql扩展中如何处理结果集_请写出PHP处理结果集的5个函数(使用mysql扩展)_学小易找答案...
[单选题]在MySQL中,选择数据库的命令是( ) [单选题]开启mysqli扩展的配置语句是( ). [单选题]19世纪美国杰出的浪漫主义小说家麦尔维尔的代表作是 [单选题]卤素灯检漏时,发现管子大 ...
- mysql运用索引写出高效sql_从SQL Server到MySql(5) : 高性能的MySql 索引策略
高效地选择和使用索引有很多种方式, 其中有些是针对特殊案例的优化方法, 有些则是针对特定行为的优化. 1 独立的列 如果查询中的列不是独立的, 则MySql 就不会使用索引. 索引列不能是表达式的一部 ...
- mysql四种常用的索引_四种常见的索引类型
主键索引:数据记录里面不能有 null,数据内容不能重复,在一张表里面不能有 多个主键索引. 普通索引:使用字段关键字建立的索引,主要是提高查询速度 唯一索引:字段数据是唯一的,数据内容里面能否为 n ...
最新文章
- dede自定义表单增加添加时间怎么弄
- linux 下修改日期和时间
- DBUtils (30)
- SAP登录IP绑定校验
- 轻量级锁的加锁和解锁逻辑
- 关闭注册表编辑器,重新启动计算机后生效。这样资源管理器重启后就不会自动重启了。...
- ArcGIS之通过Model Builder执行地理处理
- 每次Title显示不同的名言
- ShapeNet:超实时人脸特征点检测与形状拟合开源库
- 工具 转_好用的语音转文字工具,总有一款适合你!
- FQDN(Fully qualified domain name)
- django-xadmin隐藏菜单不显示
- 包括8个html的网页设计作品,8个超棒的HTML5网站设计欣赏
- oracle12c安装详解,Oracle12C安装教程
- 252个核心词根——词缀(前缀-后缀)总结大全【最全-一文看懂!!!】
- STL vector中的max_size方法
- 【DG】物理DG中LNSn、NSS、NSA进程
- antlr ques
- Unix/Linux系统中的inode总结
- ios 设置控制器背景半透明_iOS Modal出半透明控制器
热门文章
- python限制输入数字范围_关于python:如何限制Django模型中数字字段的最大值?
- vba打开txt文件_VBA基础入门(34)读取txt文本文件
- c语言求今年第m月的天数,《C语言及程序设计》实践参考——当年第几天(数组方案)...
- 使用case语句的3个诀窍
- 基础计算机构,基础计算与设计
- 中兴、深度、中国电子打造 UOS 统一操作系统:开源、支持龙芯和海思等国产处理器
- 沉船会有什么_世界六大沉船,最后一艘有40吨财宝!8吨黄金!你眼红了吗?
- python手机销售系统结论于心得_python实现手机销售管理系统
- python plot函数label_python – Matplotlib Contour Clabel位置
- 决策树缺失值python_【机器学习笔记之二】决策树的python实现