mysql优化概述2
一、索引的概念
利用关键字,就是记录的部分数据(某个字段,某些字段,某个字段的一部份),建立与记录位置的对应关系,就是索引。索引的关键字一定是排序的。 二、索引的类型
mysql支持四种索引:
1、主键索引
2、唯一索引
3、普通索引
4、全文索引 无论任何形式的索引,都是通过建立关键字与位置的对应关系来实现的。
差异:对索引关键字的要求不同。
关键字:记录部分数据(某个字段,某些字段,某个字段的一部份) 普通索引(index):对关键字没有要求
唯一索引(unique index):要求关键字不能重复,同时增加唯一约束。
主键索引(primary key):要求关键字不能重复,同时不能为NULL。
全文索引(fulltext key):关键字的来源不是所有字段的数据,而是从字段中提取的特别关键字。 *如果一个索引通过在多个字段上提取的关键字,称之为复合索引。 三、索引的语法
创建:
1、创建表时创建索引
create table student (
id int unsigned not null auto_increment,
name varchar(32) not null default '',
nickname varchar(32) not null default '',
sn char(12) not null default '',
desc text,
primary key (`id`), --主键索引
unique index `ui_sn` (`sn`), --唯一索引
index `name_nickname` (`name`,`nickname`), --复合索引
fulltext index `fi_desc` (`desc`) --全文索引
)engine=myisam charset=utf8;
索引可以起名字,主键索引不能起名字,一个表只能有一个主键索引,其它索引可以有多个。名字可以省略,mysql自动生成。 2、更新表结构时创建索引
alter table student add primary key (`id`);
alter table student add unique index `ui_sn` (`sn`);
alter table student add index `name_nickname` (`name`,`nickname`);
alter table student add fulltext index `fi_desc` ('desc');
*如果表中存在数据,数据符合唯一或主键的约束才能创建成功。
*auto_increment属性,依赖于key。 删除:
alter table student drop primary key;
alter table student drop index `ui_sn`;
alter table student drop index `name_nickname`;
alter table student drop index `fi_desc`; 四、索引的使用
可以通过在select语句前使用explain,来获取该查询语句的执行计划。

1、索引的使用场景
索引检索:条件过滤
索引排序:如果order by排序需要的字段上存在索引,可能使用到索引。
索引覆盖:索引拥有的关键字内容,覆盖了查询所需要的全部数据,此时就不需要数据区获取数据,仅仅在索引区中。 student表结构如下:

如果我们要查询name,nickname,和sn这三个字段: > select name,nickname,sn from student where name like 'a%';
通过分析我们可以在ename上建立索引来提高查询效率。 > alter table student add index `i_name` (`name`); > explain select name,nickname,sn from student where name like 'a%'\G;

如上所示,查询确实用到了索引。
如果我们在name,nickname和sn上建立一个复合索引,结果会是怎么样? > alter table student add index `i_nns` (`name`,`nickname`,`sn`);

如上所示,只需要检索出索引中的所有数据即可。 五、索引使用的原则
索引存在,没有满足使用原则,导致索引无效。
1、列独立,如需要某个字段上使用索引,则字段在参与的表达式中,保证字段独立在一侧。

如上所示,id+1=5 就不是独立列,所以没有使用索引。 2、左原则
LIKE:所匹配的关键字必须在左边,如果通配符出现在左边将不能使用索引。

复合索引:仅仅针对左边字段有效果

3、OR的原则
必须要保证两端的条件都存在可以使用的索引,才能使用到索引。

4、mysql智能选择
即使满足了如上的原则,mysql也不一定会使用索引。
弃用索引的主要原因:查询即使使用索引,会导致出现大量的随机IO,相对于数据记录从第一条遍历到最后一条的顺序IO开销,还要大。
mysql优化概述2的更多相关文章
- MySQL优化概述
一. MySQL优化要点 MySQL优化是一门复杂的综合性技术,主要包括: 1 表的设计合理化(符合 3NF,必要时允许数据冗余) 2.1 SQL语句优化(以查询为主) 2.2 适当添加索引(主键索引 ...
- mysql优化概述4
一.分区 1.分区概念 将某张表数据,分别存储到不同的区域中. 每个分区,都是独立的表,都要存储该分区的数据,索引信息. 2.创建分区 创建表并指定分区的选项 create table 表名 ( 定义 ...
- mysql优化概述3
1.前缀索引 建立索引关键字一种方案. 通常会使用字段的整体作为索引关键字. 有时,使用字段前部分数据,也可以去识别某些记录. 语法: index `索引名` (`字段`(N)); 使用字段前N个字符 ...
- Mysql优化-概述
摘抄并用于自查笔记 为什么要优化 一个应用吞吐量瓶颈往往出现在数据库的处理速度上. 随着应用程序的使用,数据库数据逐渐增多,数据库处理压力逐渐增大. 关系型数据库的数据是存放在磁盘上,读写速度慢(与内 ...
- Mysql优化概述及其压力测试工具
衡量指标 TPS:Transactions Per Second (每秒传输的事物处理个数) ,这是指服务器每秒处理的事物数,支持事物的存储引擎如Innodb等特有的一个性能指标; QPS:Queri ...
- mysql优化一 之 优化内容概述及开启慢查日志的相关配置
1-1数据库优化的目的 首先是为了避免出现页面访问错误(基本有三种) (1)由于数据库连接timeout产生的页面5XX错误 (2)由于慢查询造成页面无法加载 (3)由于阻塞造成的数据无法提交 其次: ...
- 深入MySQL(四):MySQL的SQL查询语句性能优化概述
关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...
- 0104探究MySQL优化器对索引和JOIN顺序的选择
转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...
- MySQL优化技巧
目录 MySQL的特点 数据类型优化 整型类型 小数类型 字符串类型 时间类型 主键类型的选择 特殊类型的数据 索引优化 一个使用Hash值创建索引的技巧 前缀索引 多列索引 聚簇索引 覆盖索引 重复 ...
随机推荐
- 一份CTR的特征工程图
- Thread 1 cannot allocate new log的问题分析 (转载)
Thread 1 cannot allocate new log的问题分析 发生oracle宕机事故,alert文件中报告如下错误: Fri Jan 12 04:07:49 2007Thread 1 ...
- storm的定时任务
应用场景: 第一种方法 参考代码StormTopologyTimer1.java package yehua.storm; import java.util.Map; import org.apach ...
- MySQL数据库索引(上)
上一篇回顾: 1.数据页由七部分组成,包括File Header(描述页的信息).Page Header(描述数据的信息).Infimum + Supremum(页中的虚拟数据最大值和最小值).Use ...
- SpringJdbc之queryForXXX大全解读
一.查询单个字段 Object queryForObject(String sql, Object[] args, Class requiredType) 其中Class requiredTy ...
- 解决QT出现XXXX.dll不能加载问题
第一步:下载相关动态链接文件(这里以ig4icd32.dll为例子) 下载地址:ig4icd32.dll文件 第二步:把下载的文件放在两个地方,记住!一定得放在两个地方,我试了少一个都不行! C:\W ...
- python学习之RabbitMQ-----消息队列
RabbitMQ队列 首先我们在讲rabbitMQ之前我们要说一下python里的queue:二者干的事情是一样的,都是队列,用于传递消息 在python的queue中有两个一个是线程queue,一个 ...
- 如何使用change命令改变密码的属性
使用chage更改用户密码密码使用情况 -d //设置最近一次更改密码时间, 0下次登陆系统强制修改密码 -m //设置用户两次改变密码之间使用"最小天数" -M //设置用户两次 ...
- LSTM(Long Short-Term Memory)长短期记忆网络
1. 摘要 对于RNN解决了之前信息保存的问题,例如,对于阅读一篇文章,RNN网络可以借助前面提到的信息对当前的词进行判断和理解,这是传统的网络是不能做到的.但是,对于RNN网络存在长期依赖问题,比如 ...
- leetcode326
public class Solution { public bool IsPowerOfThree(int n) { && ( % n == ); } } https://leetc ...