mysql 中文列索引_一个mysql多列索引的问题
这周工作时曾遇到一个问题。在一个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多列索引的问题相关推荐
- mysql for update场景_一个mysql死锁场景实例分析
前言 最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录. 涉及知识点:共享锁.排他锁.意向锁.间隙锁.插入意向锁.锁等待队列 场景 隔离级别:Repeatable-Re ...
- mysql中文模糊查询_解决MySQL中文模糊查询问题
解决MySQL中文模糊查询问题: 我们在MySQL中进行中文模糊查询时,经常会返回一些与之不相关的记录,比如查找%a%时,返回的可能有中文字符,却没有a字符存在.对于此问题目前发现一种方法可以很方便解 ...
- mysql 中文模糊查询_解决mysql中文模糊查询问题的方法
mysql进行中文模糊检索时,经常会返回一些与之不相关的记录,如查找 "%a%" 时,返回的可能有中文字符,却没有a字符存在. 通过阅读MySQL的Manual,发现了一种可以满意 ...
- mysql中文乱码解决方案_关于MySQL中文乱码的完美解决方案
当用客户端或用其他方式连接数据键入中文数据后,在client中的显示为乱码,当然这是字符集设置出现了问题.我先后尝试了很多办法 当用客户端或用其他方式连接数据键入中文数据后,在client中的显示为乱 ...
- 从永远到永远-Navicat将MySQL数据库复制到另一个Mysql数据库
Navicat将MySQL数据库复制到另一个Mysql数据库 1.需求 2.方案 3.问题 1.需求 云服务器快到期了,实在不想续费了.一个是再续费太贵,再一个就是性能一般.索性直接买了个32G内存笔 ...
- mysql 主表某一列 小于某一个表的两列之和_关于MySQL索引知识与小妙招
1.1 索引的优点 大大减少了服务器需要扫描的数据量,加快数据库的检索速度 帮助服务器避免排序和临时表 将随机io变成顺序io 1.2 索引的用处 速查找匹配WHERE子句的行 从considerat ...
- mysql表索引坏掉处理_一个mysql表索引被破坏的问题及解决
下午上班,惊闻我的dedecms的网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为: Table './dedecmsv4/dede_archives' is marked as ...
- mysql四种常用的索引_四种常见的索引类型
主键索引:数据记录里面不能有 null,数据内容不能重复,在一张表里面不能有 多个主键索引. 普通索引:使用字段关键字建立的索引,主要是提高查询速度 唯一索引:字段数据是唯一的,数据内容里面能否为 n ...
- mysql第三章关系模型_一个MySQL关系模型只有三个关系(二维表)组成。_学小易找答案...
[判断题]DELETE语句功能是对表中所有记录或满足条件的记录进行批量删除. [填空题]The computer's entire ____ was on a single board. [单选题]下 ...
- mysql5.6 函数索引_聊聊MySQL中的索引
关于MySQL中的索引使用 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题. 索引的存储分类: 1.B-Tree索引:最常见的索引类型,大部分引擎都支 ...
最新文章
- MyEclipse断点调试
- 我的4条产品设计工作观
- nagios用NsClient自定义windows监控
- VTK:Qt之ShowEvent
- 字符串不替代_TI-Nspire 系列的字符串操作
- P2852 [USACO06DEC]Milk Patterns G
- pline加点lisp_用Autolisp 在AutoCAD中实现多种曲线的绘制
- 二叉树的递归遍历(先序,中序,后序)
- linux 编译 php7_Linux下编译安装PHP7
- Java SSM篇2——框架的基本认识
- yb3防爆电机型号含义_YBK3防爆电机介绍
- python实现knn分类_knn分类算法底层实现(python)
- linux端口连通性测试telnet、wget、ssh、curl
- java gson 解析json字符串_JSON 之GSON 解析
- MOOC下载器的文档整理
- vim命令下显示行号
- 你晓得什么叫风华绝代
- JSP和Thymeleaf
- Android开发之EditText属性详解
- 【project2016】解决project2016安装与office冲突问题
热门文章
- 8.Docker技术入门与实战 --- 使用Dockerfile创建镜像
- 47. Magneto Transaction Email(1)
- win10 查看系统开机历史记录
- 微信小游戏flappy bird填坑
- python 操作目录注意事项
- HDU 1063 [Exponentiation]高精度
- (BFS)uva2554-Snakes Ladders
- 使用TypeScript开发ReactNative应用的简单示例
- tcp/ip通信第5期之客户机端程序
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps...