在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相关推荐

  1. mysql select 补空行_用前一行的值填充空行mysql

    /*如表中不包含任何主柱或標識列,因此不能決定哪些值是以前的值.這將是隨機的. 上面設置的值很小,這就是爲什麼下面的查詢不會有任何問題. 如果是較大的,然後繼續前進,把標識列和 更換標識列行號列的查詢 ...

  2. mysql select内部原理_数据库SQL SELECT查询的工作原理

    作为Web开发人员,虽并非专业的DBA,但我们总是离不开数据库.一般开发员只会应用SQL的四条经典语句:select,insert,delete,update.以至于从来没有研究过它们的工作原理,在这 ...

  3. 在Oracle中写出性能优良的SQL语句

    我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器 ...

  4. mysql离散查询_如何写出高性能的MySQL查询

    作者:会写代码的猪 发布时间:December 25, 2009 分类:猪在写代码 想写这样一篇文章很久了,但始终没有下手.最近帮同事看了几个查询,而且自己也在考虑一个索引系统的问题,所以今天就把这个 ...

  5. mysql 强制使用索引_快速找出MySQL数据库冗余索引和未使用索引

    冗余索引和未使用索引的危害 随着上线的业务越来越多,在MySQL数据库中建的表也会越来越多,为提高查询访问速度,会创建相应的索引.但是由于技术人员的水平参差不齐,业务下线,代码逻辑变更等原因,导致线上 ...

  6. mysql做kv数据库_从零开始写KV数据库:基于哈希索引

    前言 新的KV数据库层出不穷,我们经常听说的KV数据库如RocksDb.Hbase等都是基于日志结构的存储引擎.最近我在看<数据密集型应用系统设计>,里面有一章专门在讲日志结构的存储引擎的 ...

  7. mysql扩展中如何处理结果集_请写出PHP处理结果集的5个函数(使用mysql扩展)_学小易找答案...

    [单选题]在MySQL中,选择数据库的命令是( ) [单选题]开启mysqli扩展的配置语句是( ). [单选题]19世纪美国杰出的浪漫主义小说家麦尔维尔的代表作是 [单选题]卤素灯检漏时,发现管子大 ...

  8. mysql运用索引写出高效sql_从SQL Server到MySql(5) : 高性能的MySql 索引策略

    高效地选择和使用索引有很多种方式, 其中有些是针对特殊案例的优化方法, 有些则是针对特定行为的优化. 1 独立的列 如果查询中的列不是独立的, 则MySql 就不会使用索引. 索引列不能是表达式的一部 ...

  9. mysql四种常用的索引_四种常见的索引类型

    主键索引:数据记录里面不能有 null,数据内容不能重复,在一张表里面不能有 多个主键索引. 普通索引:使用字段关键字建立的索引,主要是提高查询速度 唯一索引:字段数据是唯一的,数据内容里面能否为 n ...

最新文章

  1. dede自定义表单增加添加时间怎么弄
  2. linux 下修改日期和时间
  3. DBUtils (30)
  4. SAP登录IP绑定校验
  5. 轻量级锁的加锁和解锁逻辑
  6. 关闭注册表编辑器,重新启动计算机后生效。这样资源管理器重启后就不会自动重启了。...
  7. ArcGIS之通过Model Builder执行地理处理
  8. 每次Title显示不同的名言
  9. ShapeNet:超实时人脸特征点检测与形状拟合开源库
  10. 工具 转_好用的语音转文字工具,总有一款适合你!
  11. FQDN(Fully qualified domain name)
  12. django-xadmin隐藏菜单不显示
  13. 包括8个html的网页设计作品,8个超棒的HTML5网站设计欣赏
  14. oracle12c安装详解,Oracle12C安装教程
  15. 252个核心词根——词缀(前缀-后缀)总结大全【最全-一文看懂!!!】
  16. STL vector中的max_size方法
  17. 【DG】物理DG中LNSn、NSS、NSA进程
  18. antlr ques
  19. Unix/Linux系统中的inode总结
  20. ios 设置控制器背景半透明_iOS Modal出半透明控制器

热门文章

  1. python限制输入数字范围_关于python:如何限制Django模型中数字字段的最大值?
  2. vba打开txt文件_VBA基础入门(34)读取txt文本文件
  3. c语言求今年第m月的天数,《C语言及程序设计》实践参考——当年第几天(数组方案)...
  4. 使用case语句的3个诀窍
  5. 基础计算机构,基础计算与设计
  6. 中兴、深度、中国电子打造 UOS 统一操作系统:开源、支持龙芯和海思等国产处理器
  7. 沉船会有什么_世界六大沉船,最后一艘有40吨财宝!8吨黄金!你眼红了吗?
  8. python手机销售系统结论于心得_python实现手机销售管理系统
  9. python plot函数label_python – Matplotlib Contour Clabel位置
  10. 决策树缺失值python_【机器学习笔记之二】决策树的python实现