- 浏览: 532801 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
c__海棠依旧:
很强,对于我这个新手很容易理解,准们登录来给你点赞的!
BeanFactory和FactoryBean -
hudazheng:
很清晰!
X86、X64和X86_64区别 -
hugh.wang:
...
BeanFactory和FactoryBean -
CB00J:
...
Executor框架和线程池 -
Arbow:
请教一个问题。现在互联网业务的数据库通常用分片方式来连接一组数 ...
BoneCP源码——概述
在MySQL中,下面几种情况可能使用到索引:
1、对于多列索引,只要查询的条件中用到了索引的最左边列,索引一般就会被使用
如下按company_id、money的顺序创建一个复合索引:
CREATE INDEX idx_sales_companyid_money ON sales(company_id,money);
然后按company_id进行查询:
EXPLAIN SELECT col1 FROM sales WHERE company_id=1 \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sales type: ref possible_keys: idx_sales_companyid_money key: idx_sales_companyid_money key_len: 5 ref: const rows: 1 Extra: Using where
发现即使where条件中不是用company_id和money的组合条件,索引仍然使用到,这个就是B-TREE索引的前缀特性。但是如果只按money条件查询,索引将不会被使用到,如:
EXPLAIN SELECT col1 FROM sales WHERE money=1 \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sales type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1000 Extra: Using where
2、对于使用LIKE的查询,后面如果是常量,并且第一个字符不是%,索引才会被使用
EXPLAIN SELECT col1 FROM company WHERE name LIKE '%3' \G; EXPLAIN SELECT col1 FROM company WHERE name LIKE '3%' \G;
上面第一个查询不使用索引,第二个查询使用索引,而且如果LIKE 后面跟的是一个列名,也不会使用索引。
3、避免负向查询,NOT、!=、 <> 、!< 、!> 、NOT EXISTS 、NOT IN 、NOT LIKE
如果列名是索引,使用column_name IS NULL 将使用索引,如:
mysql> EXPLAIN SELECT * FROM e_enterprise WHERE domain IS NULL \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: e_enterprise type: ref possible_keys: uk_enterprise_domainame key: uk_enterprise_domainame key_len: 195 ref: const rows: 1 Extra: Using where 1 row in set (0.00 sec)
但是如果使用column_name IS NOT NULL,则不会使用索引,如:
mysql> EXPLAIN SELECT * FROM e_enterprise WHERE domain IS NOT NULL \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: e_enterprise type: ALL possible_keys: uk_enterprise_domainame key: NULL key_len: NULL ref: NULL rows: 1423193 Extra: Using where 1 row in set (0.00 sec)
存在索引,但不使用索引的情况:
1、如果MySQL估计使用索引比全表扫描慢,则不使用索引,例如如果列key_part1均匀分部在1和100之间,则下列查询使用索引效果就不是很好:
SELECT col1,col2 FROM table_name WHERE key_part1>1 AND key_part1<90;
2、如果用到MEMORY/HEAP表并且WHERE条件中不使用=进行索引,那么不会用到索引列。HEAP表只有在"="条件下才会使用到索引。
3、使用OR条件的查询,如果只有一边是索引列,则不会使用到索引,如下面查询domain中有索引,但是加上OR查询后就没有使用索引:
mysql> EXPLAIN SELECT * FROM e_enterprise WHERE domain ='ffffff' \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: e_enterprise type: const possible_keys: uk_enterprise_domainame key: uk_enterprise_domainame key_len: 195 ref: const rows: 1 Extra: 1 row in set (0.00 sec) mysql> EXPLAIN SELECT * FROM e_enterprise WHERE domain ='ffffff' OR address='XXX' \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: e_enterprise type: ALL possible_keys: uk_enterprise_domainame key: NULL key_len: NULL ref: NULL rows: 1423193 Extra: Using where 1 row in set (0.00 sec)
4、如果查询条件不是索引列的第一个字段,则不会使用到索引,B-TREE索引的列前缀特性。
5、如果LIKE查询以%开头,同上。
6、同数据类型的列值比较,原则是数字对数字,字符对字符
6.1、数值列与字符类型比较
都同时转换成双精度进行比较,可以使用索引
6.2、字符列与数值比较
字符列转换成数值,不会使用索引
如果列类型是字符类型,则在WHERE条件中一定要加上单引号查询,要么不会使用索引,如下:
mysql> EXPLAIN SELECT * FROM e_enterprise WHERE domain ='6020400' \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: e_enterprise type: const possible_keys: uk_enterprise_domainame key: uk_enterprise_domainame key_len: 195 ref: const rows: 1 Extra: 1 row in set (0.00 sec) mysql> EXPLAIN SELECT * FROM e_enterprise WHERE domain = 6020400 \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: e_enterprise type: ALL possible_keys: uk_enterprise_domainame key: NULL key_len: NULL ref: NULL rows: 1423193 Extra: Using where 1 row in set (0.00 sec)
7、隔离列,也就是索引的列不能是表达式的一部分,也不能位于函数中
下面的查询将不能使用actor_id上的索引 SELECT col1 FROM actor WHERE actor_id+1=5; 下面查询也是常见错误 SELECT ... WHERE TO_DAYS(CURRENT_DATE)-TO_DAYS(date_col)<=10; 这个查询date_col值离今天不超过10天的所有行,但是他不能使用索引,因为date_col位于函数中,下面是较好的写法: SELECT ... WHERE date_col>=DATE_SUB(CURRENT_DATE,INTERVAL 10 DAY); 这个查询可以使用索引,但是还有可以改进的地方,使用CURRENT_DATE将会阻止MySQL将查询结果缓存,可以使用常量换掉CURRENT_DATE,如: SELECT ... WHERE date_col>=DATE_SUB('2012-08-08',INTERVAL 10 DAY);
发表评论
-
Mysql 乐观锁的实现
2016-10-25 10:28 0上一篇文章《MySQL悲观 ... -
MySQL查询分析器EXPLAIN或DESC
2012-09-20 11:47 6329MySQL可以通过EXP ... -
MySQL LIMIT分页查询优化
2012-09-19 15:04 1951当数据量大的时候一般的分页就吃不消了,先是把COUNT(*)计 ... -
MySQL慢查询分析工具mysqlsla
2012-09-19 14:04 1492一款帮助语句分析、过滤、分析和排序MySQL慢日志 ... -
MySQL 锁表
2012-07-03 20:27 64691.FLUSH TABLES WITH READ LOCK ... -
MySql 账号管理
2012-07-18 22:31 19711、创建账号,有两种方式,一种为使用GRANT,一种直接操作权 ... -
MySql 权限管理
2012-06-16 16:52 1623MySql身份认证是通过IP地址和用户名联合认证的 ... -
mysqldump 数据导出工具使用
2012-06-13 21:39 2120mysqldump客户端工具用来备份数据库或者在不同数据库之前 ... -
MySQL DDL语句
2012-06-11 20:15 14259DDL语句是定义语言的缩写,是对数据库内部的对象进 ... -
Mysql 修改存储引擎
2012-06-11 17:15 1659修改mysql配置文件my.cnf 在[mysql ... -
MySql优化之:选择优化的数据类型
2012-05-23 08:10 4907MySql支持多种不同的数据类型,选择正确的类型对于获得高性能 ... -
MySQL游标
2012-04-06 10:26 13893Mysql从 5.0 开始支持 ... -
yum 安装 mysql
2012-01-07 18:18 10951、CentOS默认安装的mysql数据库没有mysqld服 ... -
查看MySQL存储引擎
2012-01-07 18:18 9961、SHOW ENGINES; 2、SHOW CREA ... -
mysqld_multi 配置MySQL多实例
2011-11-18 17:39 18127本文讲利用MySQL源码安装MySQL并用mysqld_mul ... -
FLUSH TABLES WITH READ LOCK 和 LOCK TABLES
2011-11-07 08:57 12821.FLUSH TABLES WITH READ L ... -
CHAR和VARCHAR使用原则
2011-10-24 14:12 1663CHAR是固定长度,处理速度要比VARCHAR的要快,但是要浪 ... -
MySQL 浮点型 定点型 长度
2011-10-21 11:40 13738MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M ... -
MySQL 整型 长度 ZEROFILL属性
2011-10-21 08:04 17953在MySQL中创建整型字段INT(或其它像TINYINT)时, ...
相关推荐
MySQL 索引使用有哪些注意事项呢?.md
NULL 博文链接:https://zsg86.iteye.com/blog/1612385
MySQl索引优化课件,详细得介绍了MySQl索引优化数据库
本篇文章主要介绍了mysql索引使用技巧及注意事项,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
mysql索引的设计和使用
MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。
1.怎么可以提高Mysql数据库数据检索的效率? 2.怎么可以帮助数据库服务器避免排序和临时表? 3.怎么可以降低数据库的IO成本?
主要给大家介绍了关于mysql索引使用率监控技巧的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
MySql索引 索引优点 1.可以通过建立唯一索引或者主键索引,保证数据的唯一性. 2.提高检索的数据性能 3.在表连接的连接条件 可以加速表与表直接的相连 4.建立索引,在查询中使用索引 可以提高性能 索引缺点 1.在...
MySQL 索引最佳实践很不错,虽然是英文版
介绍mysql不同的存储引擎 以及 索引技术在mysql中的应用
7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7月6日 MySQL索引篇7...
《MySQL索引原理及如何建立高效索引.pptx》主要讲述mysql数据库索引底层原理、作用、 索引使用、索引失效等核心技术点。非常实用!!!
MySQL Innodb 索引原理详解
MySQL索引类型大汇总 mysql里需要用到了
MySQL何时使用索引,何时不使用索引,归纳的还算详细,可以看看。
MySQL索引背后的数据结构及算法原理:全部介绍mysql索引使用的一些常用的技术,也有索引优化的策略
由浅入深探究mysql索引结构原理、性能分析与优化
可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列。请看下面这个查询: Select age ## 不使用索引 FROM people Where firstname='Mike' ## 考虑使用索引 AND lastname='...
1. 索引与执行计划 1 1.1. 索引入门 1 1.1.1. 索引是什么 1 1.1.2. 索引得分类 3 1.1.3. 基础语法 3 1.2. 执行计划 3 1.2.1. 什么是执行计划 3 1.2.2. 执行计划的作用 3 1.2.3. 执行计划的语法 4 1.2.4. 执行计划...