mysql创建索引

MySQL存储引擎-InnoDB&MyISAM

拥有回忆 提交于 2019-12-17 13:47:23
前言 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势,本文只讨论最常见的InnoDB和MyISAM两种存储引擎进行讨论。 InnoDB存储引擎 InnoDB是默认的事务型存储引擎,也是最重要,使用最广泛的存储引擎。在没有特殊情况下,一般优先使用InnoDB存储引擎。 1. 数据存储形式: 使用InnoDB时,会将数据表分为.frm 和 idb两个文件进行存储。 2、锁的粒度 InnoDB采用MVCC(多版本并发控制)来支持高并发,InnoDB实现了四个隔离级别,默认级别是REPETABLE READ,并通过间隙锁策略防止幻读的出现。它的锁粒度是行锁。 3、事务 InnoDB是典型的事务型存储引擎,并且通过一些机制和工具,支持真正的热备份。 4、数据的存储特点 InnoDB表是基于聚簇索引(另一篇博客有介绍)建立的,聚簇索引对主键的查询有很高的性能,不过他的二级索引(非主键索引)必须包含主键列,索引其他的索引会很大。 更深入的了解: MySQL索引实现原理分析 MyISAM存储引擎 1、数据存储形式 MyISAM采用的是索引与数据分离的形式,将数据保存在三个文件中.frm.MYD,.MYIs。 2、锁的粒度 MyISAM不支持行锁

mysql数据库的常用引擎和对比

徘徊边缘 提交于 2019-12-17 12:45:08
Innodb引擎,mysql的默认引擎 特点: 1、 InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎 。 InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合 2、InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的 2,提供了行级锁和外键的约束 3、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上 6、InnoDB被用在众多需要高性能的大型数据库站点上 InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件 4,不支持全文搜索的 5

Mysql优化的思路方法详解

依然范特西╮ 提交于 2019-12-17 11:54:18
一、分析Mysql慢的原因 1、CPU计算复杂,语句问题 2、频繁的I/O 二、准确定位 1、检查慢查询 (1)先可以查看日志和慢查询 查看所有日志状态: show variables like '%quer%'; 查看慢查询状态:show variables like 'show%' (2)如何发现有问题的sql long_Qury_time 注意:查看是否开启慢查询 eg:show variables like '%long_Qury_time%' 开启 set glaobal slow_Qury_log=1 默认慢查询是10秒,如果修改之后需要重新打开一个新的对话 (3)explain返回各列的含义 3.1 MySql内部函数explain(查询sql的执行计划) 使用方法以及返回各列的含义explain返回各列的含义 table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index 和ALL possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。 key:实际使用的索引。如果为NULL,则没有使用索引。 keyjen:使用的索引的长度。在不损失精确性的情况下,长度越短越好ref:显示索引的哪一列被使用了,如果可能的话,是一个常数 rows

SQL数据库基础语法

馋奶兔 提交于 2019-12-17 10:23:12
SQL语句的概述 SQL语言的分类   数据定义语言(Data Definition Language)主要用于修改、创建和删除数据库对象,其中包括CREATE ALTER DROP语句。   数据查询语言(Data Query Language)主要用于查询数据库中的数据,其主要是SELECT语句,SELECT语句包括五个子句,分别是FROM WHERE HAVING GROUP BY和WITH语句。   数据操作语言(Data Manipulation Language)主要用于更新数据库里数据表中的数据,包括INSERT UODATE DELETE语句。   数据控制语言(Data Control Language)主要用于授予和回收访问数据库的某种权限。包括GRANT REVOKE等语句。   事物控制语言,主要用于数据库对事物的控制,保证数据库中数据的一致性,包括COMMIT ROLLBACK语句。   常用的数据类型     MYSQL:           SQL语句的书写规范     SQL语句中不区分关键字的大小写     SQL语句中不区分列名和对象名的大小写     SQL语句对数据库中数据的大小写敏感     SQL语句中使用--注释时,--后面至少有一个空格,多行注释用/* */   数据库的创建与删除   (1)数据库的创建:     CREATE

【转-mysql-explain介绍】

萝らか妹 提交于 2019-12-17 05:29:42
explain显示了 MySQL 如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 先解析一条sql语句,看出现什么内容 EXPLAIN SELECT s . uid , s . username , s . name , f . email , f . mobile , f . phone , f . postalcode , f . address FROM uchome_space AS s , uchome_spacefield AS f WHERE 1 AND s . groupid = 0 AND s . uid = f . uid 1. id SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序,看下面这条sql EXPLAIN SELECT * FROM ( SELECT * FROM uchome_space LIMIT 10 ) AS s 它的执行结果为 可以看到这时的id变化了 2.select_type   select类型,它有以下几种值   2.1 simple 它表示简单的select,没有union和子查询   2.2 primary 最外面的select,在有子查询的语句中,最外面的select查询就是primary,上图中就是这样   2.3 union

MySQL学习之提高SQL查询的效率

本秂侑毒 提交于 2019-12-17 04:19:28
目录 建索引时 查询时 建索引时 1. 首先应考虑在常常用于条件判断的字段上创建索引 2. 尽量选择区分度高的列建立索引 如果为区分度低的列建立索引,会导致索引树很高 一般在 2 ~ 4 层 区分度公式: count ( distinct col ) / count ( * ) 数值越大表示查询的记录越少,表示字段不重复的比例 3. 当需要组合搜索时 , 使用组合索引代替多个单列索引 4. 在创建联合索引时,根据业务需求,将 where 子句中使用最频繁的一列放在最左边 , 像这种范围的放到后面去 查询时 查询时要正确命中索引 1. select 子句中尽量避免使用 * 2. count ( 1 ) / count ( 主键 / 列 ) 代替 count ( * ) 3. 避免对字段使用例如: UCASE ( ) / LCASE ( ) / MID ( ) 等内置函数 4. where 子句比较符号左侧避免表达式、函数 尽量避免在 where 条件子句中,比较符号的左侧出现表达式、函数等操作 例如: where 成绩 + 5 > 90 (表达式在比较符号的左侧) 优化方法: where 成绩 > 90 – 5 (表达式在比较符号的右侧) 5. 索引字段不要参与计算 6. 索引字段不要使用函数 7. 索引类型要一致 例: where id = 3 而不是 where id = '3'

MYSQL explain详解

不问归期 提交于 2019-12-17 03:24:23
转自:http://blog.csdn.net/zhuxineli/article/details/14455029,就是做个笔记,收藏下。 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 先解析一条sql语句,看出现什么内容 EXPLAIN SELECT s . uid , s . username , s . name , f . email , f . mobile , f . phone , f . postalcode , f . address FROM uchome_space AS s , uchome_spacefield AS f WHERE 1 AND s . groupid = 0 AND s . uid = f . uid 1. id SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序,看下面这条sql EXPLAIN SELECT * FROM ( SELECT * FROM uchome_space LIMIT 10 ) AS s 它的执行结果为 可以看到这时的id变化了 2.select_type select类型,它有以下几种值 2.1 simple 它表示简单的select,没有union和子查询 2.2 primary

MySQL查看SQL语句执行效率

半世苍凉 提交于 2019-12-17 01:16:23
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。 Explain语法:explain select … from … [where ...] 例如:explain select * from news; 输出: +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ 下面对各个属性进行了解: 1、id:这是SELECT的查询序列号 2、select_type:select_type就是select的类型,可以有以下几种: SIMPLE:简单SELECT(不使用UNION或子查询等) PRIMARY

mysql语句优化

别说谁变了你拦得住时间么 提交于 2019-12-16 23:50:23
=============================sql语句优化和索引=========================== 1.Innerjoin和左连接,右连接,子查询 A. inner join内连接也叫等值连接是,left/rightjoin是外连接。 SELECT A.id,A.name,B.id,B.name FROM A LEFT JOIN B ON A.id =B.id; SELECT A.id,A.name,B.id,B.name FROM A RIGHT JOIN ON B A.id= B.id; SELECT A.id,A.name,B.id,B.name FROM A INNER JOIN ON A.id =B.id; 经过来之多方面的证实inner join性能比较快,因为inner join是等值连接,或许返回的行数比较少。但是我们要记得有些语句隐形的用到了等值连接,如: SELECT A.id,A.name,B.id,B.name FROM A,B WHERE A.id = B.id; 推荐:能用inner join连接尽量使用inner join连接 -------------------------------------------------------------------------------------------------

MySQL查询优化

*爱你&永不变心* 提交于 2019-12-16 23:11:54
转自:http://blog.csdn.net/kevinlifeng/article/details/43233227 声明是自己学习不是原创,望大家支持原创。 Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A. inner join内连接也叫等值连接是,left/rightjoin是外连接。 SELECT A.id,A.name,B.id,B.name FROM A LEFT JOIN B ON A.id =B.id; SELECT A.id,A.name,B.id,B.name FROM A RIGHT JOIN ON B A.id= B.id; SELECT A.id,A.name,B.id,B.name FROM A INNER JOIN ON A.id =B.id; 经过来之多方面的证实inner join性能比较快,因为inner join是等值连接,或许返回的行数比较少。但是我们要记得有些语句隐形的用到了等值连接,如: SELECT A.id,A.name,B.id,B.name FROM A,B WHERE A.id = B.id; 推荐:能用inner join连接尽量使用inner join连接 B.子查询的性能又比外连接性能慢,尽量用外连接来替换子查询。 Select* from A where exists (select *