一、基本语句优化

1.尽量避免在列上进行运算,这样会导致索引失败。例如:

select * from table where DATE_FORMAT(`customer_regtime`,'%Y')>='2010'

优化为

select * from table where customer_regtime>='2010-01-01'

2.在使用join时,应该根据功能的需要尽量使用小结果集驱动大结果集。同时把复杂的join查询拆分成多个query。因为join多表时,可能导致更多的锁定和堵塞。

3.仅列出需要的字段,这对查询速度没有影响,但是对内存可以节省很多。例如:

select * from customer;

优化为

select customer_id,customer_name from customer;

4.使用批量插入时节省交互例如:

insert into a1(name) values('name1');

insert into a1(name) values('name2');

insert into a1(name) values('name3');

insert into a1(name) values('name4');

优化为:

insert into a1(name) values('name1'),('name2'),('name3'),('name4');

5.limit 的基数比较大时,可以使用where between 或其他方式代替。

6.不要使用rand函数获取多条随机数据例如:

select * from a2 order by rand() limit 20;

可以使用php参数随机数使用 mysql in 查询 。

7.避免使用null

8.不要使用count(id),因该使用count(*)

9.不要做无谓的排序操作,尽可能的在索引中完成。

二、索引与性能分析

查看sql执行的效率可以通过开始 profiling 来查看

set profiling =1;

开启后执行sql语句mysql就会分析执行该sql 的详细报告

例如  多执行几遍

select * from a2;

然后 查看

show profiles;

第一次用时是最长的比后面的时间变多了几乎一倍,这是因为mysql缓存了查询。

如果需要查看某一个语句的细节可以使用

show profile cpu,block io for query 4;

结果为:

查看select 语句在执行过程中是否用到索引,如果是联合查询时联合的顺序类型等信息可以使用explain

explain select * from a2;

结果为:

个属性含有如下

id:查询序列号

select_type:查询的类型,主要包括普通查询,联合查询、子查询。

table:查询的表明。

type:联合查询使用的类型。

possible_keys:表示mysql能使用哪个索引在该表中找到该行。如果这个值是空就表示没有用到索引,可以通过检查where子句,看看是否引用了某些字段。

key:显示mysql实际决定使用的键。如果没有索引被应用则为空。

key_len:显示mysql决定使用的键长度。如果键是null这个也是null。这个值反应出一个多重主键里实际使用了哪部分。

ref:显示哪个字段或常数与key一起被使用。

rows:这个值表示mysql要便利多少数据才能找到需要的结果集,在innodb上不准确。

extra:如果是 only index,意味着信息只能用索引树中的信息检索,这比扫描整个表要快,如果是where used,则表示使用了where 限制,但是用索引还不够,如果是impossi-ble where,则表示通过收集到的统计信息判断出不可能存在的结果。除此之外,extra还有下面一些可能值:using filesort:表示包含orderby 且无法使用索引进行排序操作时,不得不使用相应的排序算法实现。using temporary:使用临时表,常见于orderby和group by。select tables optimized way:使用聚合函数,并且mysql进行了快速定位。通常是max,min,count(*) 等函数。

type特别说明:type显示的访问类型是较重要的指标:结果重好到坏一次是:system(系统表),const(读常量),eq_tef(最大一条比配结果,通常是通过主键访问),ref(被驱动表索引引用),fulltext(全文索引检索),ref_of_null(带空值的索引查询),index_merge(合并索引结果集),unique_subquery(子查询中返回的字段是唯一组合或索引),index_subquery(子查询返回的是索引,但非主键),range(索引范围扫描),index(全索引烧苗),all(全表扫描)。

一般来说,保证查询至少range级,最好能达到ref级。all为全表扫描,是最坏的情况,表示没有用到索引。

索引的建立和使用原则:

合理设计和使用索引。

在关键字段的索引上,建与不建索引,查询数度相差近100倍。

差的索引和没有索引想过一样。

索引并非越多越好,因为维护需要成本。

每个表的索引在5个一下,应合理利用部分索引和联合索引。

不在结果集中的结果单一的列上建立索引。比如性别字段只有0和1两种结果,在这个字段上建立索引不会有太大的帮助。

建索引的字段结果集最好分布均匀,或者符合正态分布。

mysql根据语句自动实现索引_mysql 语句的索引和优化相关推荐

  1. MySQL第九章索引_MySQL高级(索引优化+慢查询定位)

    一.先谈谈事务 1. ACID特性 1.1 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 1.2 一致性: 执行事务前后,数据库从一个一致性状态转换 ...

  2. mysql如何创建简单索引_mysql 如何创建索引呢,这个其实很简单

    mysql 如何创建索引? mysql 如何创建索引呢,这个其实很简单 create index或者为己有字段增加索引 ALTER TABLE `table_name` ADD UNIQUE (`co ...

  3. mysql按升序创建索引_MySQL 降序索引

    MySQL 降序索引 简介:在本教程中,您将了解MySQL降序索引以及如何利用它来提高查询性能. MySQL降序索引简介 降序索引是以降序存储键值的索引.在MySQL 8.0之前,您可以DESC在索引 ...

  4. php增加mysql索引_mysql怎么添加索引

    在mysql中可以通过使用alter table这个SQL语句来为表中的字段添加索引. 1.添加PRIMARY KEY(主键索引)mysql>ALTER TABLE `table_name` A ...

  5. mysql查询中怎样使用索引_MySQL如何使用索引

    初始化测试数据 创建一个测试用的表 create tabledept( idint primary keyauto_increment , deptNamevarchar(32) not null u ...

  6. mysql怎么加索引_mysql怎么添加索引

    在mysql中可以通过使用alter table这个SQL语句来为表中的字段添加索引. 1.添加PRIMARY KEY(主键索引)mysql>ALTER TABLE `table_name` A ...

  7. mysql 如何加索引_mysql如何添加索引

    mysql添加索引的方法:可以通过[create table]语句来添加,如[CONSTRAINT PRIMARY KEY | INDEX [] [] ],表示创建一般索引. 在mysql中可以在创建 ...

  8. mysql建立联合索引_mysql之联合索引

    mysql之联合索引测试: 前期准备: 建立联合索引? CREATE TABLE `test` ( `id` bigint(16) NOT NULL AUTO_INCREMENT, `aaa` var ...

  9. mysql怎样创建索引_mysql如何创建索引?

    mysql创建索引的方法:1.使用CREATE TABLE语句配合INDEX或UNIQUE关键字在创建表的时候直接创建索引:2.使用ALTER TABLE语句来直接创建索引:3.使用CREATE IN ...

最新文章

  1. phpmailer SMTP Error: Could not connect to SMTP host. 错误解决
  2. java 多线程缓存_[Java教程]【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列...
  3. java第九章实验报告_2019JAVA第九次实验报告
  4. ASP.NET开发资源
  5. Django操作mysql数据库增删改查
  6. 呆萌的图模型学习——使用networkx计算node2vec,得到节点与边的embedding(三)
  7. 1075 - Incorrect table definition;there can be only one auto column and it must be defined as a key
  8. oracle匿名代码块执行insert,MyBatis+Oracle在执行insert时空值报错之从源码寻找解决办法...
  9. rust怎么传送到队友_王者荣耀原初法阵怎么传送?原初法阵最多传送几个人?...
  10. Maven 编译打包时如何忽略测试用例
  11. 计算机网络 —— 组网
  12. git修改本地仓库和远程仓库名称
  13. 软考网络工程师笔记-分值分布
  14. FFmpeg —— Linux下使用ffmpeg硬件cuda解码mp4,并加入简单cv处理,sdl渲染窗口(附源码)
  15. 印地语freeCodeCamp YouTube频道+不和谐聊天现已上线
  16. TCP三次握手中SYN,ACK,Seq三者的关系
  17. 4g内存 mysql_mysql 4G内存配置表
  18. [单调栈 扫描线] BZOJ 4826 [Hnoi2017]影魔
  19. 企业微信自建应用调试方法以及小坑
  20. JavaScript前端判断文件是否存在(案例详解)

热门文章

  1. dbforge studio for oracle 注册,dbForge Studio for Oracle
  2. 连载一:Oracle迁移文档大全
  3. 最佳实践 | 腾讯HTAP数据库TBase助力某省核心IT架构升级
  4. 分享两个常见的搜索算法:BFS和DFS
  5. 保姆级带你深入阅读NAS-BERT
  6. 华为云PB级数据库GaussDB(for Redis)揭秘第六期:Feed流场景中的应用
  7. 自定义TBE算子入门,不妨从单算子开发开始
  8. js中如何在不影响既有事件监听的前提下新增监听器
  9. 小白学HarmonyOS,HarmonyOS 2.0正式发布 分布式能力获得全面升级
  10. 红橙Darren视频笔记 流式布局tagLayout measure layout方法学习 adapter使用 学习感悟