`
chenzehe
  • 浏览: 538234 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL索引使用

 
阅读更多

在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索引 使用笔记

    【MySQL索引 使用笔记】 ...以上是对MySQL索引使用的基本概念和实践要点的介绍,实际应用中还需要结合具体业务场景和数据特点进行调整和优化。学习并掌握索引的正确使用,对于提升数据库性能至关重要。

    MySQL 索引使用有哪些注意事项呢?.md

    MySQL 索引使用有哪些注意事项呢?.md

    04-VIP-Mysql索引优化实战一.pdf

    MySQL索引优化是数据库性能提升的关键环节,本篇主要探讨了几个关于MySQL索引使用和优化的重要知识点。 首先,创建了一个名为`employees`的员工记录表,其中包含`id`(主键)、`name`、`age`、`position`和`hire_...

    MySQL索引优化课件

    MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...

    5分钟掌握Mysql索引使用和失效.zip

    本文将深入探讨如何有效地使用MySQL索引,以及何时可能会导致索引失效。 首先,我们要理解索引的基本原理。索引就像是书籍的目录,它允许数据库快速定位到所需的数据行,而无需逐行扫描整个表。在MySQL中,常见的...

    mysql索引使用技巧及注意事项

    本文将深入探讨MySQL索引的使用技巧和注意事项。 一、索引的作用 1. 提高查询效率:索引如同字典的目录,它允许数据库引擎快速定位到所需的数据,避免全表扫描,从而极大地提升了查询速度。 2. 降低磁盘I/O:通过...

    mysql索引使用率监控技巧(值得收藏!)

    MySQL索引是数据库管理系统中用于加速数据...监控和分析MySQL索引使用率可以帮助识别性能瓶颈,进而优化查询,提升数据库性能。定期审查索引使用情况并调整索引策略,可以确保数据库在处理大量数据时仍保持高效运行。

    mysql索引数据结构详解

    MySQL 索引使用树形结构来存储数据,具体来说,就是 B+ 树。B+ 树是一种自平衡的搜索树,它可以保持树的高度尽可能的小,从而提高查询效率。 在 B+ 树中,每个节点都是一个页结点,页结点的大小为 16KB。每个页结点...

    MySQL 索引最佳实践

    ### MySQL索引最佳实践 #### 理解索引的重要性 在数据库管理中,索引是一种数据结构,用于提高查询速度。它对于开发者和数据库管理员(DBA)来说至关重要。索引选择不当可能会导致生产环境中的诸多问题。尽管索引...

    mysql存储与索引技术

    MySQL 数据库是一个广泛使用的开源关系型数据库管理系统,其性能很大程度上取决于存储引擎和索引的选取与使用。本文将深入探讨 MySQL 中的存储引擎和索引技术,帮助优化数据库性能。 首先,MySQL 提供了多种存储...

    mysql 索引与执行计划

    ### MySQL 索引与执行计划 #### 一、索引与执行计划 ##### 1.1 索引入门 在深入探讨之前,我们首先需要理解什么是索引以及其重要性。 ###### 1.1.1 索引是什么 索引(Index)在MySQL中是一种帮助数据库高效获取...

    MySQL索引 聚集索引

    MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。

    MySQL索引类型大汇总

    MySQL 索引类型大汇总 MySQL 索引类型是数据库性能优化的关键所在。索引可以大幅度提高查询速度,提高数据库的...索引是 MySQL 数据库性能优化的关键所在,合理的使用索引可以提高查询速度,提高数据库的高效运行。

    MySQL索引最佳实践

    ### MySQL索引最佳实践 #### 一、理解MySQL索引的重要性 索引是数据库性能优化中最常用也是最重要的手段之一。合理的索引设计可以显著提高查询效率,减少服务器资源的消耗。在MySQL中,索引的选择与配置对于开发...

    MySql索引使用策略分析

    MySql索引 索引优点 1.可以通过建立唯一索引或者主键索引,保证数据的唯一性. 2.提高检索的数据性能 3.在表连接的连接条件 可以加速表与表直接的相连  4.建立索引,在查询中使用索引 可以提高性能 索引缺点 1.在...

    MySql索引详解,索引可以大大提高MySql的检索速度

    打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的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月6日 MySQL索引篇7...

Global site tag (gtag.js) - Google Analytics