MySQL的索引优化

[TOC]

一、MySQL 5.7的初始化配置

/usr/local/mysql/bin/mysqld --initialize-insecure  --user=mysql --datadir=/opt/mysql/data --basedir=/opt/mysql

二、MySQL配置文件

1、配置

vim /etc/my.cnf
[mysqld]
basedir = /opt/mysql
datadir = /opt/mysql/data
port = 3306
user = mysql
socket = /tmp/mysql.sock
log_error = /var/log/mysql.log
[mysql]
socket=/tmp/mysql.sock

2、配置文件作用

(1)影响服务端的启动

标签:[mysqld]   [mysqld_safe]   [server]   ...
  • 必须配置的内容
[mysqld]
basedir = /opt/mysql
datadir = /opt/mysql/data
user = mysql
socket = /tmp/mysql.sock
port = 3306
server_id = 6

(2)影响客户端的连接

标签:[client]  [mysql]    [mysqldump] ...
  • 配置内容
[mysql]
socket = /tmp/mysql.sock

(3)影响初始化

三、多实例

端口号为3307、3308、3309

1、创建相关的目录

mkdir -p /data/330{7..9}/data

2、创建实例的配置文件

cat>> /data/3307/my.cnf<<EOF
[mysqld]
basedir=/opt/mysql
datadir=/data/3307/data
user=mysql
socket=/data/3307/mysql.sock
port=3307
server_id=3307
EOF cp /data/3307/my.cnf /data/3308
cp /data/3307/my.cnf /data/3309 sed -i 's#3307#3308#g' /data/3308/my.cnf
sed -i 's#3307#3309#g' /data/3309/my.cnf

3、初始化

# 初始化数据
mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/opt/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/opt/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/opt/mysql

4、授权

chown -R mysql.mysql /data/*

5、启动实例

mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &

6、查看启动状况

netstat -lnp|grep 330

7、测试

mysql -S /data/3307/mysql.sock
mysql -S /data/3308/mysql.sock
mysql -S /data/3309/mysql.sock

8、配置启动脚本

cat >> /etc/systemd/system/mysqld3307.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF cp /etc/systemd/system/mysqld3307.service /etc/systemd/system/mysqld3308.service
cp /etc/systemd/system/mysqld3307.service /etc/systemd/system/mysqld3309.service sed -i 's#3307#3308#g' /etc/systemd/system/mysqld3308.service
sed -i 's#3307#3309#g' /etc/systemd/system/mysqld3309.service

9、开机自启

[root@standby ~]# systemctl start mysqld3307
[root@standby ~]# systemctl start mysqld3308
[root@standby ~]# systemctl start mysqld3309
[root@standby ~]# netstat -lnp|grep 330
tcp6 0 0 :::3307 :::* LISTEN 3773/mysqld
tcp6 0 0 :::3308 :::* LISTEN 3808/mysqld
tcp6 0 0 :::3309 :::* LISTEN 3843/mysqld
tcp6 0 0 :::3306 :::* LISTEN 2721/mysqld
[root@standby ~]# systemctl stop mysqld3309
[root@standby ~]# systemctl stop mysqld3308
[root@standby ~]# systemctl stop mysqld3307 [root@standby ~]# systemctl enable mysqld3307
[root@standby ~]# systemctl enable mysqld3308
[root@standby ~]# systemctl enable mysqld3309

10、设定mysql密码

mysqladmin -uroot -p password 123

11、忘记密码

# root等用户信息存在mysql.user表中
select user,authentication_string,host from mysql.user; # 1.停数据库
/etc/init.d/mysqld stop
# 2.启动数据库为无密码验证模式
mysqld_safe --skip-grant-tables --skip-networking &
update mysql.user set authentication_string=PASSWORD('456') where user='root' and host='localhost';
/etc/init.d/mysqld restart [root@standby ~]# mysql -uroot -p123
[root@standby ~]# mysql -uroot -p456

四、数据类型

1、整型

int
最多存10位数字:-2^31 ~ 2^31-1

2、字符串类型

char       定长,存储效率高,但是对于变化多的字段,空间浪费高
varchar 变长,存储时判断长度,存储会有额外开销,按需分配空间
enum 枚举类型

3、时间类型

datetime    日期+时间
date 日期
timestamp 时间戳
time 时间

规范

  • 少于10位数,用 int;大于10位用 char
  • char 和 varchar 选择时,字符长度一定不变用 char ;字符长度改变的用 varchar
    在使用可变的数据类型时,将来使用不同的数据类型,对于索引树的高度会有影响
  • 选择合适的数据类型
  • 合适长度

五、索引

1、索引作用

优化查询,select 查询有三种情况:缓存查询(不在mysql中进行数据查询),全表扫描,索引扫描

2、索引种类

  • Btree(btree b+tree b*tree)

  • Rtree

  • HASH

  • FullText

3、Btree 分类

聚集索引:基于主键,自动生成的,一般是建表时创建主键。如果没有主键,自动选择唯一键做为聚集索引
辅助索引:人为创建的(普通,覆盖)
唯一索引:人为创建(普通索引,聚集索引)

4、聚集索引和辅助索引的对比

  • 聚集索引:叶子结点,按照主键列的顺序,存储的整行数据,就是真正的数据页
  • 辅助索引: 叶子结点,列值排序之后,存储到叶子结点+对应的主键的值,便于回表查询

六、MySQL索引管理

1、创建索引(辅助索引)

alter table blog_blog add key idx_name(name);
# 或者
create index index_name on blog_blog(name);

2、删除索引

alter table blog_blog drop key idx_name(name);
# 或者
drop index index_name on blog_blog(name);

3、查看创建的索引

show index from blog_blog;

4、前缀索引

# select count(*),substring(password,1,20) as sbp  from blog_userinfo group by sbp;
alter table blog_userinfo add index idx(password(10));

5、唯一键索引

alter table blog_blog add unique key uni_name(name);

6、覆盖索引(联合索引)

作用:不需要回表查询,不需要聚集索引,所有的数据都从辅助索引中获取

alter table t1 add index idx_abc(age,box,electric);   # 第一个为主要条件,第一条件,查询量多的条件放前面,有序

# 查询的时候,where后面条件不是age放首位的条件,都不走联合索引

七、explain(desc)命令的应用

获取优化器选择后的执行计划

 oldguo [world]>explain select * from city where countrycode='CHN'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: city
type: ref
possible_keys: CountryCode,idx_co_po
key: CountryCode
key_len: 3
ref: const
rows: 1
Extra: Using index condition
1 row in set (0.00 sec)

1、字段

(1)type —— 查询类型(上至下性能增加)

  • 判断是全表扫描还是索引扫描(ALL是全表扫描,其他的是索引扫描)

  • 判断是哪一种类的索引扫描
    ALL:全表扫描 —— select * from t1;
    Index:全索引扫描 —— desc select countrycode from city ;

    range:索引范围扫描 —— where > < >= <= in or between and like 'CH'

    select * from city where country in ('China','USA')s

    ref:辅助索引等值查询 —— in与or替换为union的查询效率会提高

    select * from city where country='China'
    union all
    select * from city where country='USA'

    eq_ref:多表连接查询(join on )

    constsystem :主键或唯一键等值查询

(2)Extra

using filesort:文件排序,可以进行优化

将order by、group by、distinct 后面的列和where条件列建立联合索引

(3)其他字段

possible_keys: CountryCode,idx_co_po      ---->可能会走的索引
key: CountryCode ---->真正走的索引
type: ref ---->索引类型
Extra: Using index condition ---->额外信息

八、建立索引规范

1、建表时一定要有主键,如果相关列可以作为主键,做一个无关列

2、选择唯一性索引

唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。

主键索引和唯一键索引,在查询中使用是效率最高的。

注意:如果重复值较多,可以考虑采用联合索引

3、为经常需要排序、分组和联合操作的字段建立索引

经常需要ORDER BY、GROUP BY,join on等操作的字段,排序操作会浪费很多时间。
如果为其建立索引,可以有效地避免排序操作。

4、为常作为where查询条件的字段建立索引

如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,
为这样的字段建立索引,可以提高整个表的查询速度。

5、尽量使用前缀来索引
如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索
会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

6.限制索引的数目
索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。
修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。 7.删除不再使用或者很少使用的索引(percona toolkit)
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理
员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。 8.大表加索引,要在业务不繁忙期间操作

九、建立索引原则

(1) 必须要有主键,如果没有可以做为主键条件的列,创建无关列
(2) 经常做为where条件列 order by group by join on的条件(业务:产品功能+用户行为)
(3) 最好使用唯一值多的列作为索引,如果索引列重复值较多,可以考虑使用联合索引
(4) 列值长度较长的索引列,我们建议使用前缀索引.
(5) 降低索引条目,一方面不要创建没用索引,不常使用的索引清理,percona toolkit
(6) 索引维护要避开业务繁忙期

十、不走索引的情况

1、没有查询条件,或者查询条件没有建立索引

2、查询结果集是原表中的大部分数据,应该是25%以上

3、索引本身失效,统计数据不真实

4、查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等)

5、隐式转换导致索引失效.这一点应当引起重视,也是开发中经常会犯的错误.

6、<> ,not in 不走索引

7、 like "%_" 百分号在最前面不走

8、单独引用联合索引里非第一位置的索引列.作为条件查询时不走索引.

十一、压力测试

1、模拟数据库数据

vim slap.sh
... # 执行脚本:
sh slap.sh

2、检查数据可用性

mysql -uroot -p123
select count(*) from oldboy.t1;

3、优化前进行压力测试

mysqlslap --defaults-file=/etc/my.cnf \
--concurrency=100 --iterations=1 --create-schema='oldboy' \
--query="select * from oldboy.t1 where stuname='alexsb_100'" engine=innodb \
--number-of-queries=2000 -uroot -p123 -verbose

4、创建索引再测试

mysql> alter table t1 add index idx_name(stuname);

# 重复第三步,进行压力测试

数据库(二)—— MySQL索引优化的更多相关文章

  1. mysql数据库优化课程---17、mysql索引优化

    mysql数据库优化课程---17.mysql索引优化 一.总结 一句话总结:一些字段可能会使索引失效,比如like,or等 1.check表监测的使用场景是什么? 视图 视图建立在两个表上, 删除了 ...

  2. Mysql数据库知识-Mysql索引总结 mysql mysql数据库 mysql函数

    mysql数据库知识-Mysql索引总结: 索引(Index)是帮助MySQL高效获取数据的数据结构. 下边是自己整理的资料与自己的学习总结,,做一个汇总. 一.真的有必要使用索引吗? 不是每一个性能 ...

  3. Mysql 索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  4. MySQL索引优化看这篇文章就够了!

    阅读本文大概需要 5 分钟. 来源:cnblogs.com/songwenjie/p/9410009.html 本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引 ...

  5. mysql索引优化比普通查询速度快多少

    mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...

  6. mySql索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  7. 讲真,MySQL索引优化看这篇文章就够了

    本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引背后的数据结构三部分相关内容,下面一一展开. 一.MySQL——索引基础 首先,我们将从索引基础开始介绍一下什么 ...

  8. 深入浅出Mysql索引优化专题分享|面试怪圈

    文章纲要 该文章结合18张手绘图例,21个SQL经典案例.近10000字,将Mysql索引优化经验予以总结,你可以根据纲要来决定是否继续阅读,完成这篇文章大概需要25-30分钟,相信你的坚持是不负时光 ...

  9. 知识点:Mysql 索引优化实战(3)

    知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ...

  10. mysql索引优化

    mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间 ...

随机推荐

  1. HTMLtr 标签的 valign 属性

    valign 属性规定表格行中内容的垂直对齐方式. <table width="100%" border="1"> <tr valign=&q ...

  2. spark streaming 笔记

    spark streaming项目 学习笔记 为什么要flume+kafka? 生成数据有高峰与低峰,如果直接高峰数据过来flume+spark/storm,实时处理容易处理不过来,扛不住压力.而选用 ...

  3. thinkphp中的exp查询

    今天遇到一个问题,就是在vendor表中查询出vendor_id = vendor_f_id的数据,其实使用原生的sql语句是非常简单的: select * from vendor where ven ...

  4. UVA 12446 How Many... in 3D! ( 递推 + 树状数组 )

    C. How Many... in 3D! Time Limit: 1000ms Memory Limit: 131072KB 64-bit integer IO format: %lld      ...

  5. HDFS学习笔记一

    一,HDFS是什么,HDFS有什么用,HDFS怎么用 HDFS:Hadoop Distribute File System 分布式文件系统 HDFS可以保证文件存储的可靠性, 二.HDFS的设计原则 ...

  6. IPv6 关于路由器配置静态IPv6路由的命令

    今天在学习路由器配置ipv6 的时候遇到了一点疑惑 一条命令为:ipv6 route FE80:0202::/32 serail 0/1 201 一条命令为:ipv6 route FE80:0202: ...

  7. Sublime Text 3 - there are no packages available for installation 解决方法

    解决方法: 1. 下载一个channel_v3.json ,  提取码: n2vc 2. 进入以下路径的设置界面 3. 添加代码 , 文件路径以各自下载保存路径为准 ( 重启sublime, 搞定 ! ...

  8. 使用 sar 查看网卡的流量

    1.常用命令 sar -n DEV #查看当天从零点到当前时间的网卡流量信息 sar -n DEV 1 10 #每秒显示一次,共显示10次 sar -n DEV -f /var/log/sa/saxx ...

  9. 【Flutter学习】之DateTime日期转换

    概述: 表示一个时间点 通过构造函数或解析格式化的字符串创建DateTime对象,并且符合ISO 8601标准的子集,小时是24小时制,范围在0-23之间 DateTime对象创建之后,将是固定不变的 ...

  10. webpack第一节(4)

    每次修改了代码都需要重新手动打包,这样很麻烦,不符合webpack的初衷,我们查看webpack帮助看看有没有可以自动运行的方法 输入 webpack -help 可以发现有个 --watch方法 它 ...