mysql创建索引

来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite

假如想象 提交于 2019-12-19 15:46:43
文章目录 MySQL 执行计划 Oracle 执行计划 SQL Server 执行计划 PostgreSQL 执行计划 SQLite 执行计划 执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤 ,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划。本文主要介绍如何在各种数据库中获取和理解执行计划,并给出进一步深入分析的参考文档。 现在许多管理和开发工具都提供了查看图形化执行计划的功能,例如 MySQL Workbench、Oracle SQL Developer、SQL Server Management Studio、DBeaver 等;不过我们不打算使用这类工具,而是介绍利用数据库提供的命令查看执行计划。 我们先给出在各种数据库中查看执行计划的一个简单汇总: 数据库 执行计划 MySQL EXPLAIN sql_statement; Oracle EXPLAIN PLAN FOR sql_statement; SELECT * FROM TABLE(DBMS_XPLAN.display); SQL Server SET STATISTICS PROFILE ON; sql_statement; SET STATISTICS PROFILE

MySQL 慢查询优化

喜欢而已 提交于 2019-12-19 07:52:17
为什么查询速度会慢    1.慢是指一个查询的响应时间长。一个查询的过程: 客户端发送一条查询给服务器 服务器端先检查查询缓存,如果命中了缓存,则立可返回存储在缓存中的结果。否则进入下一个阶段 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。 MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。 将结果返回给客户端    2.数据访问 是否向数据库请求了不需要的数据 是否扫描额外的记录    3.查询的方式 一个复杂的查询还是多个简单的查询 切分查询(将大查询切分成小查询,循环完成小查询) 分解关联查询 慢查询分析   问题SQL     把复杂的SQL分成多个简单SQL并执行,查看具体那个字段会慢,区分度不高。   EXPLAIN     显示SQL如何使用索引的执行计划。     执行计划的参数: table 显示这一行的数据是关于哪张表的 type 显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys 显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句 key 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE

mysql 查询优化杂谈

醉酒当歌 提交于 2019-12-19 05:25:32
  在数据库中,对性能影响最大的包括数据库的锁策略、缓存策略、索引策略、存储策略、执行计划优化策略。 索引策略决定数据库快速定位数据的效率,存储策略决定数据持久化的效率。 一。索引注意事项 1.索引不存储null值。 更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引,只能全表扫描。 为什么索引列不能存Null值? 因为将索引列值进行建树,其中必然涉及到诸多的比较操作。 2.不适合键值较少的列(重复数据较多的列)。 假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。 再加上访问索引块,一共要访问大于2000个的数据块。 如果全表扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块 少一些,肯定就不会利用索引了。 3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%') 假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB'条件,由于前面是 模糊的,所以不能利用索引的顺序,必须一个个去找,看是否满足条件。这样会导致全索引扫描或者全表扫 描。如果是这样的条件where code

mysql全文索引

自作多情 提交于 2019-12-18 21:39:32
上文中,我们了解了MySQL不同引擎下索引的实现原理,在本文我们将继续探讨一下索引的使用以及优化。 创建索引可以大大提高系统的性能。 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?因为,增加索引也有许多不利的方面。 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。 一般来说,应该在这些列上创建索引: 在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上

mysql,索引命中,查询级别

落爺英雄遲暮 提交于 2019-12-18 15:04:02
mysql索引无法命中情况 1,查询占表数据30%以上 2,小表查询 3,规定不用索引查询 4,查询条件给字符串加引号用索引,否则不用 5,条件中用到or,除非涉及到的列都有索引否则不命中 6,like 的 %在前不命中,在后命中 示例 explain select * from adminlog 执行结果: id select_type table partitjons type possible_keys key key_len ref row filtered Extra 1 SIMPLE adminlog ALL 2 100 select_type :查询类型 simple简单查询 primary 主查询 UNION 第二个或者后面的查询语句。SUBQUERY : 子查询中的第一个select] table :输出结果的表 type:查询级别 type=ALL 全表扫描, type=index 索引全扫描,遍历整个索引来查询匹配的行 type=range 索引范围扫描,常见于 <,<=,>,>=,between,in等操作符。   例     explain select * from adminlog where id>0 ,     explain select * from adminlog where id>0 and id<=100     explain

MySQL性能优化

亡梦爱人 提交于 2019-12-18 05:48:47
1.索引对查询速度的影响 MySQL中提高性能的一个最有效的方式就是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度,因此,索引对查询的速度由着至关重要的影响。使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。本小结将为读者介绍索引对查询速度的影响。 如果查询时没有使用索引,查询语句将扫描表中的所有记录。在数据量大的情况下,这样查询的速度回很慢。如果使用索引进行查询,查询语句可以根据索引快速定位到待查询记录,从而减少查询的记录数,达到提高查询速度的目的。 1 #下面是查询语句中不使用索引和使用索引的对比。首先,分析未使用索引的查询情况,EXPLAIN语句执行如下: 2 explain select * from t_fruits where f_name='apple'; 3 explain select * from t_fruits where f_name='apple'; 4 +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+ 5 | id | select_type | table | partitions | type |

MySql的优化步骤

点点圈 提交于 2019-12-18 00:18:21
MySql优化的一般步骤: 1.通过show status 命令了解各种sql的执行效率   SHOW STATUS提供msyql服务器的状态信息   一般情况下,我们只需要了解以”Com”开头的指令   show session status like ‘Com%’:显示当前的连接的统计结果   show global status like ‘Com%’ :显示自数据库上次启动至今的统计结果   注:默认是session级别的   其中Com_XXX表示XXX语句所执行的次数。 重点注意:Com_select,Com_insert,Com_update,Com_delete通过这几个参数,可以容易地了解到当前数据库的应用是以插入更新为主还是以查询操作为主,以及各类的SQL大致的执行比例是多少。   另外,还有几个参数需要注意下:   show status like ‘Connections’// 试图连接MySQL服务器的次数   show status like ‘Uptime’//服务器工作的时间(单位秒)   show status like ‘Slow_queries’//慢查询的次数 (默认是10秒中就当做是慢查询,如下图所示)      a) 如何查询mysql的慢查询时间     Show variables like 'long_query_time';  

数据库优化的注意点和建议

坚强是说给别人听的谎言 提交于 2019-12-17 19:08:21
1、分库分表 纵向分库分表 横向分库分表 2、减少join 适当使用冗余存储字段 3、使用索引 4、减少使用范围查询、减少子查询(使用join关联查询)、减少not使用 5、查看是否存在隐藏的字段转型 6、索引的可以创建联合索引、顺序索引的字段顺序,默认要分辨度越高越排在前面 7、不要烂用索引,创建无谓的索引 8、必须创建一个主键,主键的逻辑顺序最好和物理顺序一致 9、数据库优化器无法使用正确的索引,可以使用强制索引 force index(`索引名`) 10、尽量不要用mysql的group by ,可以从代码上多查询几次。或者业务代码里面进行分类 来源: CSDN 作者: 龙仔1984 链接: https://blog.csdn.net/ma_ru_long/article/details/103575363

MYSQL 什么时候用单列索引?什么使用用联合索引?(收集)

北慕城南 提交于 2019-12-17 18:05:07
我一个表 students 表,有3个字段 ,id,name,age 我要查询 通过 name 和age,在这两个字段 是创建 联合索引?还是分别在name和age上创建 单列索引呢? 多个字段查询什么情况下用联合索引 什么时候分别创建单列索引呢? 1,首先要确定优化的目标,在什么样的业务场景下,表的大小等等。如果表比较小的话,可能都不需要加索引。 2,哪些字段可以建索引,一般都where、order by 或者 group by 后面的字段。 3,记录修改的时候需要维护索引,所以会有开销,要衡量建了索引之后的得与失。 学生表,可以认为name的重复度比较小,而age的重复度比较大,对于单列索引来说,比较适合建在重读度低的列上。 对于select * from students where name='张三’and age=18; 题主所说的两种情况 A. name 和 age 各自单独建立索引。 一般来说mysql会选择其中一个索引,name的可能性比较大,因为mysq会统计每个索引上的重复度,选用低重复度的字段。另外一个age的索引就不会用到,但还有维护索引的开销,所以age的索引不需要创建。 B. name和age的联合索引 这种索引的切合度最好,mysql会直接选用这个索引。但相对单独的name索引来说,维护的成本要大一些,并且索引数据占用的存储空间也要更大一些。 回过来看

详解MySQL中EXPLAIN解释命令

南笙酒味 提交于 2019-12-17 17:07:33
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法,在select语句前加上explain就可以了: 如: explain select surname,first_name form a,b where a.id=b.id EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句 key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引 key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好 ref:显示索引的哪一列被使用了,如果可能的话,是一个常数 rows:MYSQL认为必须检查的用来返回请求数据的行数 Extra:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论