这周工作时曾遇到一个问题。在一个MYSQL的表里做类似下面这一个很简单查询的时候耗时接近1秒钟的时间。

select sum(col5) , sum(col6) from table_name

where col_key_2='value1' and col_key_3 = 'value2'

表定义如下:

CREATE TABLE `table_name` (

`col_key_1` date NOT NULL default '0000-00-00',

`col_key_3` varchar(32) NOT NULL default '',

`col_key_2` varchar(32) NOT NULL default '',

`col5` bigint(20) unsigned default NULL,

`col6` bigint(20) unsigned default NULL,

`col7` bigint(20) unsigned default NULL,

`col8` bigint(20) unsigned default NULL,

`col_key_4` varchar(32) NOT NULL default '',

PRIMARY KEY (`col_key_1`,`col_key_2`,`col_key_3`,`col_key_4`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 整个表里大概只有200多万条数据。但查询的速度居然会慢到1秒钟才能查询出来,完全不可以忍受。

然后我给这张加上了另一个索引:KEY `class` (`col_key_2`,`col_key_3`)

查询的速度立马提高到0.00秒。

于是认真的查看了一下mysql 手册的8.3小节。

MySQL索引的种类和作用

mysql的索引分成:primary key, unique, index, fulltext index。 primary key是主键, unique是唯一索引, index是普通的索引。fulltext index是全文索引。 索引的作用就像C语言里的指针那样,直接指向表的一行。

可以对用col_name(N) 对符串的前N个字节做索引。 text类型和blob类型则必须要对前N个字节做索引。MYISAM最多支持1000个字节的索引, INNODB最多支持767字节的索引。

索引有下列作用:

1 帮助where语句快速查询。

2 进行多表连接

3 找到最大值和最小值(应该只有B-tree索引有这个功能,hash索引没有这个功能)

4 sort(应该只有B-tree索引有这个功能,hash索引没有这个功能)和group

多列索引

多列索引在对多个列同时进行查询的时候特别有用。多列索引最多支持16列。可以这样理解多列索引:

把多个列concat在一起,然后再对这个concat的值做一个索引。

比较神奇的一点是,比如你有一个索引针对col1 col2 col3这3个列时, 只查询col1和只查询col1 col2时也能用到这个索引。

比如有这个表:

CREATE TABLE test (

id INT NOT NULL,

last_name CHAR(30) NOT NULL,

first_name CHAR(30) NOT NULL,

PRIMARY KEY (id),

INDEX name (last_name,first_name)

); 下面这些查询都可以用到多列索引:

SELECT * FROM test WHERE last_name='Widenius';

SELECT * FROM test

WHERE last_name='Widenius' AND first_name='Michael';

SELECT * FROM test

WHERE last_name='Widenius'

AND (first_name='Michael' OR first_name='Monty');

SELECT * FROM test

WHERE last_name='Widenius'

AND first_name >='M' AND first_name < 'N'; 下面这些查询不能用到多列索引:

SELECT * FROM test WHERE first_name='Michael';

SELECT * FROM test

WHERE last_name='Widenius' OR first_name='Michael';

你可以在sql语句前使用explain语句来确定是否用到了索引。

比如下面这个查询就可以用到class这个索引

mysql> explain select sum(col5) , sum(col6) from table_name

where col_key_2='value1' and col_key_3 = 'value2' \G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: table_name

type: ref

possible_keys: class

key: class

key_len: 68

ref: const,const

rows: 1

Extra: Using where

1 row in set (0.00 sec) 而下面这个查询则不能使用到索引:

mysql> explain select sum(col5) , sum(col6) from table_name

where col5='value1' and col_key_3 = 'value2' \G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: table_name

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 2357455

Extra: Using where

1 row in set (0.00 sec)

索引的好坏

MySQL使用一个指标value group size来衡量索引的好坏。什么是value group呢? 就是具有相同索引key值的行数。这个指标显然是越小越好。最理想的情况就是每一个key值只对应1行, 这样的话我们的每次搜索一个key值都只返回一行,显然速度非常快。

可以用mysql提供的工具查看一个表的索引的好坏。可以先用analyze table语句更新统计,然后用show index来查看统计:

mysql> analyze table table_name;

+-----------------+---------+----------+----------+

| Table | Op | Msg_type | Msg_text |

+-----------------+---------+----------+----------+

| stat.table_name | analyze | status | OK |

+-----------------+---------+----------+----------+

1 row in set (3.13 sec)

mysql> show index in table_name;

table_name这张表有两个索引PRIMARY和class,PRIMARY这个索引是一个包含4列的多列索引。

Cardinality这个值表示索引值的不同的行数。

例如:

col_key_1值有18行。

col_key_1+col_key_2 值有392909行。

col_key_1 + col_key_2 + col_key_3 值有235745行。

col_key_1 + col_key_2 + col_key_3 + col_key_4值有235745行。

通过索引值的行数,我们就可以看出来索引好还是不好了。索引值不同的行数越多索引就越好。当索引值不同的行数=表的总行数就达到最理想的情况 value group size = 1了。

B-tree索引和Hash索引的比较

默认情况下MySQL都是使用B-tree索引。来谈一下Hash索引的缺陷:

1 只能处理’=‘ 这种where 子句,而对于< >是无能为力的。 这和B-tree索引是有序的,Hash无序的有关。

2 无法处理order by。 原因同上。

3 无法得知两行之间的距离。 原因同上。

4 只能搜完整的字段,不能只搜字段的一部分。 而对于B-tree索引, 支持搜索字符串最左边的一部分。例如"police%" 。

mysql 中文列索引_一个mysql多列索引的问题相关推荐

  1. mysql for update场景_一个mysql死锁场景实例分析

    前言 最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录. 涉及知识点:共享锁.排他锁.意向锁.间隙锁.插入意向锁.锁等待队列 场景 隔离级别:Repeatable-Re ...

  2. mysql中文模糊查询_解决MySQL中文模糊查询问题

    解决MySQL中文模糊查询问题: 我们在MySQL中进行中文模糊查询时,经常会返回一些与之不相关的记录,比如查找%a%时,返回的可能有中文字符,却没有a字符存在.对于此问题目前发现一种方法可以很方便解 ...

  3. mysql 中文模糊查询_解决mysql中文模糊查询问题的方法

    mysql进行中文模糊检索时,经常会返回一些与之不相关的记录,如查找 "%a%" 时,返回的可能有中文字符,却没有a字符存在. 通过阅读MySQL的Manual,发现了一种可以满意 ...

  4. mysql中文乱码解决方案_关于MySQL中文乱码的完美解决方案

    当用客户端或用其他方式连接数据键入中文数据后,在client中的显示为乱码,当然这是字符集设置出现了问题.我先后尝试了很多办法 当用客户端或用其他方式连接数据键入中文数据后,在client中的显示为乱 ...

  5. 从永远到永远-Navicat将MySQL数据库复制到另一个Mysql数据库

    Navicat将MySQL数据库复制到另一个Mysql数据库 1.需求 2.方案 3.问题 1.需求 云服务器快到期了,实在不想续费了.一个是再续费太贵,再一个就是性能一般.索性直接买了个32G内存笔 ...

  6. mysql 主表某一列 小于某一个表的两列之和_关于MySQL索引知识与小妙招

    1.1 索引的优点 大大减少了服务器需要扫描的数据量,加快数据库的检索速度 帮助服务器避免排序和临时表 将随机io变成顺序io 1.2 索引的用处 速查找匹配WHERE子句的行 从considerat ...

  7. mysql表索引坏掉处理_一个mysql表索引被破坏的问题及解决

    下午上班,惊闻我的dedecms的网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为: Table './dedecmsv4/dede_archives' is marked as ...

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

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

  9. mysql第三章关系模型_一个MySQL关系模型只有三个关系(二维表)组成。_学小易找答案...

    [判断题]DELETE语句功能是对表中所有记录或满足条件的记录进行批量删除. [填空题]The computer's entire ____ was on a single board. [单选题]下 ...

  10. mysql5.6 函数索引_聊聊MySQL中的索引

    关于MySQL中的索引使用 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题. 索引的存储分类: 1.B-Tree索引:最常见的索引类型,大部分引擎都支 ...

最新文章

  1. MyEclipse断点调试
  2. 我的4条产品设计工作观
  3. nagios用NsClient自定义windows监控
  4. VTK:Qt之ShowEvent
  5. 字符串不替代_TI-Nspire 系列的字符串操作
  6. P2852 [USACO06DEC]Milk Patterns G
  7. pline加点lisp_用Autolisp 在AutoCAD中实现多种曲线的绘制
  8. 二叉树的递归遍历(先序,中序,后序)
  9. linux 编译 php7_Linux下编译安装PHP7
  10. Java SSM篇2——框架的基本认识
  11. yb3防爆电机型号含义_YBK3防爆电机介绍
  12. python实现knn分类_knn分类算法底层实现(python)
  13. linux端口连通性测试telnet、wget、ssh、curl
  14. java gson 解析json字符串_JSON 之GSON 解析
  15. MOOC下载器的文档整理
  16. vim命令下显示行号
  17. 你晓得什么叫风华绝代
  18. JSP和Thymeleaf
  19. Android开发之EditText属性详解
  20. 【project2016】解决project2016安装与office冲突问题

热门文章

  1. 8.Docker技术入门与实战 --- 使用Dockerfile创建镜像
  2. 47. Magneto Transaction Email(1)
  3. win10 查看系统开机历史记录
  4. 微信小游戏flappy bird填坑
  5. python 操作目录注意事项
  6. HDU 1063 [Exponentiation]高精度
  7. (BFS)uva2554-Snakes Ladders
  8. 使用TypeScript开发ReactNative应用的简单示例
  9. tcp/ip通信第5期之客户机端程序
  10. 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps...