mysql创建索引

Mysql中的语句优化

白昼怎懂夜的黑 提交于 2019-12-01 02:09:59
1、EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。 下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据: type列,连接类型。一个好的SQL语句至少要达到range级别。杜绝出现all级别。 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。 key_len列,索引长度。 rows列,扫描行数。该值是个预估值。 extra列,详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。 2、SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from t where num in(1,2,3) 对于连续的数值,能用between就不要用in了;再或者使用连接来替换。 3、SELECT语句务必指明字段名称 SELECT*增加很多不必要的消耗(CPU、IO、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名。 4、当只需要一条数据的时候,使用limit 1 这是为了使EXPLAIN中type列达到const类型 5、如果排序字段没有用到索引

mysql 中的索引

怎甘沉沦 提交于 2019-12-01 01:59:38
转载于: https://www.cnblogs.com/songwenjie/p/9410009.html 什么是索引 索引(在 MySQL 中也叫“键key”)是存储引擎快速找到记录的一种数据结构 ——《高性能MySQL》 我们需要知道索引其实是一种数据结构,其功能是帮助我们快速匹配查找到需要的数据行,是数据库性能优化最常用的工具之一。其作用相当于超市里的导购员、书本里的目录。 索引类型 可以使用 SHOW INDEX FROM table_name; 查看索引详情 主键索引 PRIMARY KEY 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。 注意:一个表只能有一个主键 唯一索引 UNIQUE 唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引 可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引 普通索引 INDEX 最基本的索引,它没有任何限制。 可以通过 ALTER TABLE table_name ADD INDEX index_name (column); 创建普通索引 组合索引 INDEX 组合索引,即一个索引包含多个列

mysql详解

☆樱花仙子☆ 提交于 2019-12-01 01:19:52
数据库 """ 1、什么是数据库:管理数据的系统 - 安装某种管理数据的系统 - 管理的对象本质是文件 2、存储数据的位置:内存、硬盘 3、什么是系统:运行在硬件基础上,管理其他软件 """ # 数据库的组成 """ 库:存放多张表 - 文件夹 表:包含多条相同结构的记录 - 文件 记录:包含多个key-value键值对的一条数据 - 二进制数据 字段:描述信息 - 信息本身 == key-value - 二进制数据 stu id name age gender 1 Bob 18 男 2 Tom 17 女 ... teacher ... """ 数据库的分类 # 1)关系与非关系 # 关系:数据库中表与表之间有联系 - mysql # 非关系:没有表概念 - redis、mongodb(介于关系与非关系) # 2)内存与硬盘 # 硬盘:数据可以永久存储 - mysql、mongodb # 内存:数据的存取效率极高 - redis、memcache # 3)sql与nosql # sql:数据库操作通过sql语句 # nosql:数据库操作就是key-value形式(value就是一条记录) # stu - {'name': 'Bob', 'age': 18} # stus - [{'name': 'Bob', 'age': 18}, {'name': 'Tom', 'age':

MySQL性能优化总结

久未见 提交于 2019-12-01 00:02:59
一、MySQL 的主要适用场景 1、Web网站系统 2、日志记录系统 3、数据仓库系统 4、嵌入式系统 二、 MySQL 架构图: 三、 MySQL 存储引擎概述 1 ) MyISAM 存储引擎 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件。首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据(.MYI)。每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI文件中。 MyISAM支持以下三种类型的索引: 1、B-Tree索引 B-Tree索引,顾名思义,就是所有的索引节点都按照balancetree的数据结构来存储,所有的索引数据节点都在叶节点。 2、R-Tree索引 R-Tree索引的存储方式和b-tree索引有一些区别,主要设计用于为存储空间和多维数据的字段做索引,所以目前的MySQL版本来说,也仅支持geometry类型的字段作索引。 3、Full-text索引 Full-text索引就是我们长说的全文索引,他的存储结构也是b-tree。主要是为了解决在我们需要用like查询的低效问题。 2 ) Innodb 存储引擎 1、支持事务安装 2、数据多版本读取 3、锁定机制的改进 4

MySql优化相关总结

£可爱£侵袭症+ 提交于 2019-12-01 00:02:07
MySQL架构 查询执行流程 查询执行的流程是怎样的: 连接 1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求 1.2将请求转发到‘连接进/线程模块’ 1.3调用‘用户模块’来进行授权检查 1.4通过检查后,‘连接进/线程模块’从‘线程连接池’中取出空闲的被缓存的连接线程和客户端请求对接,如果失败则创建一个新的连接请求。 处理 2.1先查询缓存,检查Query语句是否完全匹配, 2.2查询缓存失败则转交给‘命令解析器’ 2.3再转交给对应的模块处理 2.4如果是SELECT查询还会经由‘查询优化器’做大量的优化,生成执行计划 2.5模块收到请求后,通过‘访问控制模块’检查所连接的用户是否有访问目标表和目标字段的权限 2.6有则调用‘表管理模块’,先是查看table cache中是否存在,有则直接对应的表和获取锁,否则重新打开表文件 2.8根据表的meta数据,获取表的存储引擎类型等信息,通过接口调用对应的存储引擎处理 2.9上述过程中产生数据变化的时候,若打开日志功能,则会记录到相应二进制日志文件中 结果 3.1Query请求完成后,将结果集返回给‘连接进/线程模块’ 3.2返回的也可以是相应的状态标识,如成功或失败等 3.3‘连接进/线程模块’进行后续的清理工作,并继续等待请求或断开与客户端的连接 什么是优化 合理安排资源、调整系统参数使MySQL运行更快

MySQL高负载优化

旧时模样 提交于 2019-11-30 21:51:24
MySQL配置文件优化 [client] port = 3306#客户端端口号为3306 socket = /data/3306/mysql.sock # default-character-set = utf8 #客户端字符集,(控制character_set_client、character_set_connection、character_set_results) [mysql] no-auto-rehash #仅仅允许使用键值的updates和deletes [mysqld] #组包括了mysqld服务启动的参数,它涉及的方面很多,其中有MySQL的目录和文件,通信、网络、信息安全,内存管理、优化、查询缓存区,还有MySQL日志设置等。 user = mysql#mysql_safe脚本使用MySQL运行用户(编译时--user=mysql指定),推荐使用mysql用户。 port = 3306#MySQL服务运行时的端口号。建议更改默认端口,默认容易遭受攻击。 socket = /data/3306/mysql.sock #socket文件是在Linux/Unix环境下特有的,用户在Linux/Unix环境下客户端连接可以不通过TCP/IP网络而直接使用unix socket连接MySQL。 basedir = /application/mysql

MySQL——索引基础

久未见 提交于 2019-11-30 21:45:10
MySQL——索引基础 本篇文章,我们将从索引基础开始,介绍什么是索引以及索引的几种类型,然后学习如何创建索引以及索引设计的基本原则。 本篇文章中用于测试索引创建的user表的结构如下: 什么是索引 索引(在 MySQL 中也叫“键key”)是存储引擎快速找到记录的一种数据结构 ——《高性能MySQL》 我们需要知道索引其实是一种数据结构,其功能是帮助我们快速匹配查找到需要的数据行,是数据库性能优化最常用的工具之一。其作用相当于超市里的导购员、书本里的目录。 索引类型 可以使用 SHOW INDEX FROM table_name; 查看索引详情 主键索引 PRIMARY KEY 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。 注意:一个表只能有一个主键 唯一索引 UNIQUE 唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引 可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引 普通索引 INDEX 最基本的索引,它没有任何限制。 可以通过 ALTER TABLE table_name ADD INDEX index_name

查看Mysql执行计划

前提是你 提交于 2019-11-30 21:43:09
引言: 实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表、怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在写sql语句的时候就很少考虑到性能的问题。但是当数据规模增大,如千万、亿的时候,我们运 行同样的sql语句时却发现迟迟没有结果,这个时候才知道数据规模已经限制了我们查询的速度。所以,查询优化和索引也就显得很重要了。 问题: 当我们在查询前能否预先估计查询究竟要涉及多少行、使用哪些索引、运行时间呢?答案是能的,mysql提供了相应的功能和语法来实现该功能。 分析: 1、MySQL语法 MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个”EXPLAIN”即可。 默认情况下Mysql的profiling是关闭的,所以首先必须打开profiling set profiling="ON" mysql> show variables like "%profi%"; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | profiling | ON | show processlist; 查看现在在运行的所有进程列表

MySQL基础知识

自古美人都是妖i 提交于 2019-11-30 21:04:12
mysql的二进制日志 记录了所有对MySQL数据库的数据增删查改和对表和数据库的修改,需要在myc.cnf配置文件中进行配置 基于段的日志格式:binlog_format=STATEMENT 基于行的日志格式:binlog_format=ROW binlog_row_image=[FULL|MINIMAL|NOBLOB] 混合日志格式:binlog_format=MIXED 根据sql语句由系统决定使用基于段还是基于行的日志格式; 数据量的大小由所执行的sql语句决定 建议使用binlog_format=MIXED 或者 binlog_format=ROW并设置binlog_row_image=MINIMAL 查看二进制日志:mysqlbinlog -vv 日志文件名称,比如: mysqlbinlog -vv mysql-bin.000002 log_bin = mysql-bin # 开启及设置二进制日志文件名称 binlog_format = MIXED # 混合日志格式 sync_binlog = 1 # 二进制日志(binary log)同步到磁盘的频率 rpl_semi_sync_master_wait_point = after_sync expire_logs_days =7 #二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。 数据库优化的几个方面 (1

数据库索引

给你一囗甜甜゛ 提交于 2019-11-30 19:51:53
我们通过一个简单的例子来开始教程,解释为什么我们需要数据库索引。假设我们有一个数据库表 Employee, 这个表有三个字段(列)分别是 Employee_Name、Employee_Age 和Employee_Address。假设表Employee 有上千行数据。 现在假设我们要从这个表中查找出所有名字是‘Jesus’的雇员信息。我们决定使用下面的查询语句: SELECT * FROM Employee WHERE Employee_Name = 'Jesus' 如果表中没有所以会发生什么? 一旦我们运行这个查询,在查找名字为Jesus的雇员的过程中,究竟会发生什么?数据库不得不Employee表中的每一行并确定雇员的名字(Employee_Name)是否为 ‘Jesus’。由于我们想要得到每一个名字为Jesus的雇员信息,在查询到第一个符合条件的行后,不能停止查询,因为可能还有其他符合条件的行。所以,必须一行一行的查找直到最后一行-这就意味数据库不得不检查上千行数据才能找到所以名字为Jesus的雇员。这就是所谓的全表扫描。 数据库索引是怎样提升性能的? 你可能会想为如此简单的事情做全表扫描效率欠佳-数据库是不是应该更聪明一点呢?这就像用人眼从头到尾浏览整张表-很慢也不优雅(原文:not at all sleek,不知如何翻译才好)。但是,你可以能根据文章标题已经猜到