通常和zerofill一起使用,比如int(3),存入1,则自动填充为001。并不是存入的长度

char(n),varchar(n)中的n是最大长度。

外键索引一般不用,可以通过业务逻辑来实现。全文索引一般也不用,直接上全文搜索引擎:sphinx、elasticsearch

表索引的创建原则:最适合素银的列是出现在where子句中的列,或连接子句中的列而不是出现在select关键字后的列

索引列的基数越大,索引的效果越好

对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间

根据情况创建符合索引,符合索引可以提高查询效率

避免创建过多索引,索引会二维占用磁盘空间,降低写操作效率

主键尽量选择较短的数据类型,可以有效减少索引的磁盘占用,调高查询效率

为什么复合/多列索引更高效呢?

比如key('章','节','段'),它不是分别创建若干个索引,而是创建一个索引,作用在这个索引的组合上。缩短查询范围:如果只查某章,则扫描整个某章;若查询某章下的某节,则把某章下的某节扫描一遍。

对于where name like "%wang%"类型的查询,如果前面有%,则name的索引会失效。这种情况最好用全文搜索引擎,如:sphinx、elasticsearch

索引的注意事项:符合索引遵循前缀原则

like查询,%不能放在前面,可以使用全文索引来实现类似功能

column is null 可以使用索引

如果mysql估计使用索引比全表扫描更慢,会放弃使用索引

如果or前的条件中的列有索引,后面的没有,索引都不会被用到

列类型是字符串,查询一定要给值加引号,否则索引失效

(比如字段类型是varchar,where name="100"索引有效,where name=100索引无效)

答案1:

update A,B set A.c1=B.c1,A.c2=B.c2 where A.id=B.id and B.age>50

答案2:

update A inner join B on A.id=B.id set A.c1=B.c1,A.c2=B.c2  where B.age>50

交叉连接会产生笛卡尔积,不用。

左外连接以左表为准,右外连接以右表为准,内连接(inner join)只以on后面的条件为准。

首先要找到查询速度慢的原因。然后优化查询过程中的数据访问,优化长难的查询语句,优化特定类型的查询语句。

查询速度慢的原因:

开启慢查询日志,不建议直接打开慢查询日志进行分析,这样比较浪费时间和精力,可以使用pt-query-digest工具进行分析。

使用show profile,mysql命令行set profiling=1开启,于是所有执行的语句都会检测消耗时间,存到临时表中。

通过show profile for query 临时表id 来获取查询语句在什么动作上话费多少时间。

show status会返回一些计数器,show global status查看服务器级别的所有计数。有时根据这些计数,可以猜测出哪些操作代价较高或者消耗时间多。

show processlist用来观察是否有大量线程出于不正常的状态或者特征。

使用explain(用desc也一样)分析单条sql语句。

优化查询过程中的数据访问:

不要访问数据太多,只查寻需要的列和行,确认mysql服务器是否在分析大量不必要的数据行

使用limit,指定要返回的字段,少用select *

重复查询相同的数据,可以缓存数据,下次直接读取缓存

是否在扫描额外的记录,使用explain进行分析,若发现查询需要扫描大量数据但只返回少量的行,可通过如下技巧优化:

使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果

改变数据库和表结构,修改数据表范式。如适当冗余

重写sql语句,让优化器以更优的方式执行查询(索引优化,避免索引失效的情况)

优化长难的查询语句:

mysql内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多。使用尽可能少的查询是好的,但有时将一个大查询分解为多个小查询是很有必要的

切分查询:比如一次删除/插入1k条,暂停一会再继续...

分解关联查询:可以将一条关联语句分解成多条sql来执行(好处:让缓存效率更高,执行单个查询可以减少锁的竞争,在应用层做关联可以更容易对数据库进行拆分)

优化特定类型的查询语句:

优化count()查询,count(*)中的*会忽略所有的列,直接统计所有的列数,因此不要使用count(列名)

myisam中,没有任何where条件的count(*)非常快,当有where条件,myisam的count统计不一定比其他表引擎快

可以使用explain查询近似值,用近似值替代count(*)

增加汇总表(用一个表记录各增删改查后表中的数据条数)

缓存汇总信息

优化关联查询

确定on或using子句的列上有查询

确保group by和order by中只有一个表中的列,这样mysql才有可能使用索引

优化子查询

尽量用关联查询来替代

优化group by和distinct

均可用索引来优化,是最有效的优化方法

关联查询中,使用标识列(主键列、auto increment列)进行分组的效率会更高

如果不需要order by,进行group by时使用order by null,mysql不会再进行文件排序,否则可能会文件排序导致性能消耗

with rollup超级聚合,可以挪到应用程序处理

优化limit分页

limit偏移量大,查询效率就会低

可以记录上次查询的最大id,下次查询时直接根据id来查询

优化union查询

union all的效率高于union,可以在应用层将重复的筛选掉

分库分表:

水平分割:

表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度

使用场景:

表中的数据本身就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,有些不常用

需要把数据存放到多个介质上

缺点:

给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需union操作

在许多数据库应用中,这种复杂性会超过它带来的优点,查询时会增加读一个索引层的磁盘次数

垂直分割:

把主键和一些列放在一个表,然后把主键和另外的列放在另一个表中

使用场景:

如果一个表中某些列常用,而另外一些列不常用

可以使数据行变小,一个数据页能存储更多数据,查询时减少io次数

缺点:

管理冗余列,查询所有数据需要join操作

分库分表(水平和垂直)的缺点:

有些表的策略基于应用层的逻辑算法,一旦逻辑算法改变,整个分表逻辑都会改变,扩展性差

对应用层来说,逻辑算法无疑增加开发成本

主从复制原理:

在主库上把数据更改记录到二进制日志

从库将主库的日志复制到自己的中继日志

从库读取中继日志中的事件,将其重放到从库数据库中

主从复制解决的问题:

数据分布:随意停止或开始复制,并在不同地理位置分部数据备份

负载均衡:降低单个服务器的压力

高可用和故障切换:帮助应用程序避免单点失败

升级测试:可以使用更高版本的mysql作为从库

sql语句安全:

预处理,防止sql注入(通常用pdo方式)

写入数据对特殊字符转义

查询错误信息不要返回给客户,将错误记录到日志

定期做数据备份

不给查询用户root权限,合理分配权限

关闭远程访问数据权限

修改root口令,不用默认口令,使用较复杂口令

删除多余用户

改变root用户名称

限制一般用户浏览其他库

限制用户对数据文件的访问权限

mysql优化难_mysql优化注意点相关推荐

  1. mysql 热块_mysql 优化

    数据库层面:应用系统层面优化SQL优化 SQL优化一般通过分析慢查询日志来抓取长事务高消耗的sql,通过结合具体业务,对sql逻辑进行分析and精简,or重写sql.通过配置slow_query_lo ...

  2. mysql优化篇_MySQL优化篇-查询优化

    可以参考一下官方文档中的解释. 7. 优化 7.1. 优化概述 7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. ...

  3. 对mysql优化关注_MySQL优化看这篇就对了

    我们在面试的时候经常被问到你如何对数据库优化?动不动就分库分表,但是实际上有几个有分库分表的经验呢?下面我们将介绍优化数据库的各个阶段. 一.SQL语句优化 sql语句的优化是我们优化数据库的第一个阶 ...

  4. mysql优化方法_mysql优化方案总结

    u       Mysql数据库的优化技术 对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引.主键索引.唯一索引u ...

  5. mysql优化要点_MySQL优化技巧总结

    MySQL优化的几个大方向 ① 硬件优化 ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行参数调整 ③ SQL语句方面的优化 ④ 表方面的优化 硬件优化 cpu,内存,硬盘 ...

  6. mysql 结构优化建议_MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)...

    殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...

  7. 物理机存放mysql实例原则_MySQL优化笔记(四)--表的设计与优化(单表、多表)...

    前面讲了SQL优化以及索引的使用.设计优化了,那么接下来就到表的设计与优化啦!!!真实地去设计优化单表结构以及讲述多表设计基本原则(结合真实的生产环境的取舍来讲述). 文章结构:(1)单表设计与优化: ...

  8. mysql索引优化规则_Mysql优化选择最佳索引规则

    索引的目的在于提高查询效率,其功能可类比字典,通过该索引可以查询到我们想要查询的信息,因此,选择建立好的索引十分重要,以下是为Mysql优化选择最佳索引的方法步骤: 1. 首先列出查询中所有使用的表, ...

  9. 优化mysql服务器硬件包括_MySQL优化之一:服务器硬件和操作系统

    1 服务器硬件优化 在挑选数据库服务器时,可以从以下几个方面考虑: 1)CPU:建议采用高性能的服务器,如DELL R7.R8或R9系列的服务器. 2)磁盘:数据库服务器最大的制约在于磁盘I/O,如果 ...

最新文章

  1. python request_python爬虫03 | 那个叫做 Urllib 的库让我们的 python 假装是浏览器
  2. C++N queensN皇后的优化算法(附完整源码)
  3. 热狗树 树形dp(中国石油大学我要变强第九场)
  4. Java 之 JavaScript (一)
  5. Dataphin功能:集成——如何将业务系统的数据抽取汇聚到数据中台
  6. 9.1 LSMW程序创建操作手册 第1 2步
  7. Python学习笔记之Windows下通过pip安装Django详细介绍
  8. python对比柱状图_python 绘制分组对比柱状图
  9. 4月23日 MySQL学习-DDL
  10. apache主机的重定向和多域名绑定
  11. opencv 提取图像线条 霍夫线检测
  12. C++开发语言的特点及工作原理
  13. 让程序员崩溃的一句话。。。
  14. Intergate flot with Angular js ——Angular 图形报表
  15. CTF-WEB小技俩 ——合天网安实验室学习笔记
  16. Rendezvous: A Search Engine for Binary Code
  17. 圣诞之歌:クリスマス タイム和My Baby Grand~ぬくもりが欲しくて~ ZARD
  18. 单位根检验urdf_R语言时间序列函数整理[转]]
  19. c语言双序列全局比对,基于动态规划进行双序列全局比对
  20. cmd批量修改文件名 增加文字_文件名如何进行批量更改?

热门文章

  1. Vulkan教程 - 06 交换链
  2. 物联网卡设置_聆听物联物联网卡APN设置教程
  3. mras模型参考自适应无位置 可提供文档说明PMSM永磁电机
  4. 记录mars3d的使用 - geojson图层
  5. 如何评价“杨超越杯编程大赛”的参赛作品《杨超越秘密杂货铺》?
  6. caffe源码导读(二)Blob数据结构介绍
  7. 获取当前月的上一个月-Util
  8. CNKI文献Endnote数据采集与转换
  9. 记录网页主题如何快速置灰变成哀悼色
  10. java无法实例化类型_关于java:无法实例化类型List