- 浏览: 538234 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 6364MySQL可以通过EXP ... -
MySQL LIMIT分页查询优化
2012-09-19 15:04 1991当数据量大的时候一般的分页就吃不消了,先是把COUNT(*)计 ... -
MySQL慢查询分析工具mysqlsla
2012-09-19 14:04 1525一款帮助语句分析、过滤、分析和排序MySQL慢日志 ... -
MySQL 锁表
2012-07-03 20:27 65101.FLUSH TABLES WITH READ LOCK ... -
MySql 账号管理
2012-07-18 22:31 20261、创建账号,有两种方式,一种为使用GRANT,一种直接操作权 ... -
MySql 权限管理
2012-06-16 16:52 1659MySql身份认证是通过IP地址和用户名联合认证的 ... -
mysqldump 数据导出工具使用
2012-06-13 21:39 2157mysqldump客户端工具用来备份数据库或者在不同数据库之前 ... -
MySQL DDL语句
2012-06-11 20:15 14307DDL语句是定义语言的缩写,是对数据库内部的对象进 ... -
Mysql 修改存储引擎
2012-06-11 17:15 1725修改mysql配置文件my.cnf 在[mysql ... -
MySql优化之:选择优化的数据类型
2012-05-23 08:10 4949MySql支持多种不同的数据类型,选择正确的类型对于获得高性能 ... -
MySQL游标
2012-04-06 10:26 13931Mysql从 5.0 开始支持 ... -
yum 安装 mysql
2012-01-07 18:18 11321、CentOS默认安装的mysql数据库没有mysqld服 ... -
查看MySQL存储引擎
2012-01-07 18:18 10281、SHOW ENGINES; 2、SHOW CREA ... -
mysqld_multi 配置MySQL多实例
2011-11-18 17:39 18188本文讲利用MySQL源码安装MySQL并用mysqld_mul ... -
FLUSH TABLES WITH READ LOCK 和 LOCK TABLES
2011-11-07 08:57 13251.FLUSH TABLES WITH READ L ... -
CHAR和VARCHAR使用原则
2011-10-24 14:12 1700CHAR是固定长度,处理速度要比VARCHAR的要快,但是要浪 ... -
MySQL 浮点型 定点型 长度
2011-10-21 11:40 13793MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M ... -
MySQL 整型 长度 ZEROFILL属性
2011-10-21 08:04 18012在MySQL中创建整型字段INT(或其它像TINYINT)时, ...
相关推荐
【MySQL索引 使用笔记】 ...以上是对MySQL索引使用的基本概念和实践要点的介绍,实际应用中还需要结合具体业务场景和数据特点进行调整和优化。学习并掌握索引的正确使用,对于提升数据库性能至关重要。
MySQL 索引使用有哪些注意事项呢?.md
MySQL索引优化是数据库性能提升的关键环节,本篇主要探讨了几个关于MySQL索引使用和优化的重要知识点。 首先,创建了一个名为`employees`的员工记录表,其中包含`id`(主键)、`name`、`age`、`position`和`hire_...
MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...
本文将深入探讨如何有效地使用MySQL索引,以及何时可能会导致索引失效。 首先,我们要理解索引的基本原理。索引就像是书籍的目录,它允许数据库快速定位到所需的数据行,而无需逐行扫描整个表。在MySQL中,常见的...
本文将深入探讨MySQL索引的使用技巧和注意事项。 一、索引的作用 1. 提高查询效率:索引如同字典的目录,它允许数据库引擎快速定位到所需的数据,避免全表扫描,从而极大地提升了查询速度。 2. 降低磁盘I/O:通过...
MySQL索引是数据库管理系统中用于加速数据...监控和分析MySQL索引使用率可以帮助识别性能瓶颈,进而优化查询,提升数据库性能。定期审查索引使用情况并调整索引策略,可以确保数据库在处理大量数据时仍保持高效运行。
MySQL 索引使用树形结构来存储数据,具体来说,就是 B+ 树。B+ 树是一种自平衡的搜索树,它可以保持树的高度尽可能的小,从而提高查询效率。 在 B+ 树中,每个节点都是一个页结点,页结点的大小为 16KB。每个页结点...
### MySQL索引最佳实践 #### 理解索引的重要性 在数据库管理中,索引是一种数据结构,用于提高查询速度。它对于开发者和数据库管理员(DBA)来说至关重要。索引选择不当可能会导致生产环境中的诸多问题。尽管索引...
MySQL 数据库是一个广泛使用的开源关系型数据库管理系统,其性能很大程度上取决于存储引擎和索引的选取与使用。本文将深入探讨 MySQL 中的存储引擎和索引技术,帮助优化数据库性能。 首先,MySQL 提供了多种存储...
### MySQL 索引与执行计划 #### 一、索引与执行计划 ##### 1.1 索引入门 在深入探讨之前,我们首先需要理解什么是索引以及其重要性。 ###### 1.1.1 索引是什么 索引(Index)在MySQL中是一种帮助数据库高效获取...
MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。
MySQL 索引类型大汇总 MySQL 索引类型是数据库性能优化的关键所在。索引可以大幅度提高查询速度,提高数据库的...索引是 MySQL 数据库性能优化的关键所在,合理的使用索引可以提高查询速度,提高数据库的高效运行。
### MySQL索引最佳实践 #### 一、理解MySQL索引的重要性 索引是数据库性能优化中最常用也是最重要的手段之一。合理的索引设计可以显著提高查询效率,减少服务器资源的消耗。在MySQL中,索引的选择与配置对于开发...
MySql索引 索引优点 1.可以通过建立唯一索引或者主键索引,保证数据的唯一性. 2.提高检索的数据性能 3.在表连接的连接条件 可以加速表与表直接的相连 4.建立索引,在查询中使用索引 可以提高性能 索引缺点 1.在...
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到...
MySQL 索引使用的数据结构主要是 B+Tree。B+Tree 是一种多级索引结构,通过对数据的分类和排序,快速定位数据的位置,从而提高查询效率。 二、索引的优缺点 索引的优点有: * 索引大大减小了服务器需要扫描的数据...
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...