专栏首页Rgcmysql数据库优化(二)

mysql数据库优化(二)

1.sql防止注入

https://www.cnblogs.com/sevck/p/6733702.html

View Code

 结果:

C:\Users\ASUS\kuaigong3.6.5\lib\site-packages\pymysql\cursors.py:165: Warning: (1292, 'Truncated incorrect DOUBLE value: \'1 and nickname="AAA1"\'')
(1, 'AAA', None, 1, 1, 0, 'c46529949246a43bb6692943dd82fdb00b62b5115761079d47c6a1dd0b826a1c', 28, None, '155383902971', '15538390298', None, None, 0, '2.0.dev', 0, datetime.datetime(2018, 5, 3, 17, 13, 37), None, 1) 1 and nickname="AAA1"
  result = self._query(query)
--- None 1 and nickname="AAA1"

2.尽量批量操作数据库,比如用 事务,减少网络传输损失

3.全文索引

https://blog.csdn.net/zyz511919766/article/details/12780173

个人了解 好像只支持 单词的搜索

body = After you went through a ... 

*代表占位符,只有在单词结尾才有用,也就是和like的 ‘serach%’ 一样。

不能在一个单词,比如database中搜索 taba,这样找不到数据,所以不能代替 like 模糊查询。

对于汉字区分词只能通过英文的 逗号,句号 进行区分词语  如: 我是汉字,你大爷的费劲,和你好      这样便有三个词语

对于后置模糊搜索:

  1. select * from user where name like 'search%' 对于查询是否使用索引和 查询结果的数量(因为筛选结果过多会导致使用索引还没有全表扫描快)和select的字段有关,如果选择的字段都是有index的,则模糊查询的字段使用index,具体通过 explain查看。

  2.SELECT * FROM user WHERE MATCH (name) AGAINST ('search*' IN BOOLEAN MODE); 对于此类一定使用全文索引。

所以对于后置模糊搜索有这两种好的方式,具体用哪一种 根据实际业务分析。

4.like使用

  1. select的字段是否是索引字段为准。如果select字段全部是索引字段则模糊搜索字段绝对使用索引

        2.在select字段含有非索引字段时,只有在后置模糊搜索时 根据查询结果数量少时才使用索引,其他情况绝不使用索引

5.in,between,or 尽量使用 union all代替,不要用between和 or ,他们都会使用全表搜索.

      1.针对select字段含有非索引字段时,上面的情况有效。

      2.如果select字段都是索引字段,则使用between或者or或者union都会使用搜索条件的索引

6.union all尽量代替union . 如果根据需求搜索结果不会重复或者不关心重复,则使用此union all方式.

7.where字句尽量不要有运算或者函数,这样会导致不使用索引而使用全表扫描

8.对于数据列的类型在搜索时尽量不要改变,如 id 是int类型,不要 用 varchar类型搜索 where id = '3'  应该用 where id =3   

减少mysql在内部转换的操作

9.order by 后面尽量使用索引列

10.sql语句尽量都用一样的格式书写,这样缓存认识,从而重复查询直接取缓存,而且减轻 sql编译的复杂度。

如尽量全部 用大写,并且 select的字段加表名及别名;SELECT bill_bill.id as id FROM bill_bill WHERE bill_bill.id = 1;

11.数据库访问数据是按照 页访问数据,一页大小比如是16k,一页可以存储多行数据,所以select 多个字段和一个字段 访问数据库的数据量都是一样的。

但是当只是select 索引列时,直接从索引中取数据,不会再去读表的 页。 这也是为什么 select *  比select id 慢的原因,因为需要从表的页中读取数据,而id直接读取索引并返回

12.order by中,如果select 中有索引,很有可能结果也是按照此索引排序的,如果业务符合 可以 不要再进行order by排序,因为已经通过索引排序了。当然 如果业务需要 倒叙desc的话order by不可省略,因为索引排序的是 正序排序。

 explain 中 Extra 发生排序 的 标志是 Using Filesort(不是说进行磁盘文件排序,只是一个标志而已)

13.由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大,那么每次 IO 可访问的行数也就增多了。反过来说,处理相同行数的数据,需要访问的 page 就会减少,也就是 IO 操作次数降低,直接提升性能。此外,由于我们的内存是有限的,增加每个page中存放的数据行数,就等于增加每个内存块的缓存数据量,同时还会提升内存换中数据命中的几率,也就是缓存命中率。

        有些时候,我们可能会希望将一个完整的对象对应于一张数据库表,这对于应用程序开发来说是很有好的,但是有些时候可能会在性能上带来较大的问题。当我们的表中存在类似于 TEXT 或者是很大的 VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO 次数,也能大大提高内存中的缓存命中率

 14.mysql5.7开启慢查询日志,能够记录下响应时间超过一定阈值的SQL查询,以便于我们定位糟糕的查询语句。

默认关闭慢查询,开启方法有两种

        一:先在 sql 中查询  show variables like '%quer%';  

           再 通过set global 动态设置慢查询命令,效果只保持到下次重启数据库

                    set GLOBAL slow_query_log=ON                     set GLOBAL long_query_time = 1

                    set global long_query_time  =0.1

                    set global slow_query_log_file = /var/log/mysql/slow_query.log

          然后验证   输入: select SLEEP(2),查看 对应日志是否记录。

              结果:   

          注意:在设置后慢查询命令后要新开窗口查看 show variables like '%quer%';  及 select SLEEP(2)   命令执行结果,因为之前的窗口不会更新查询结果(具体原因不知)

          相关网址:http://blog.sina.com.cn/s/blog_5037eacb0102vht3.html

          二:通过 my.conf文件设置常量

               1.通过 find / | grep my.conf 查看文件所在位置

               2.在[mysqld]下面添加:

 slow_query_log = ON slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 0.1

             3.通过 mysqld restart 重启数据库     (但是自己重启后仍然没有配置成功)

                     配置慢查询方法:   https://blog.csdn.net/huoyuanshen/article/details/52699569

                     重启数据库方法:  https://blog.csdn.net/cx136295988/article/details/76690722

15.mysql常量含义

                 用于配置数据库  https://blog.csdn.net/longxibendi/article/details/6704969

16.数据库优化规则。

                1.利用limit分页

                2.数据库查询时返回更少的数据,避免返回不必要的数据

                3.对于不经常select的大数据量字段,比如request的值等,通过拆分表格,放到新表中,达到减少查询数据量的目的

                4.进行批量操作

                5.优化业务逻辑,根据实际业务数据情况进行优化sql查询方式等。

                5.用 >=代替 >;如>=3取出3及以上进行比较,但是>2会取出2及以上进行比较,所以 > 比 >=多比较了一次

                6.不用在索引列中使用 not,is null, is not null

                7.时间存储类型存储空间长短: DATE(精确到某一天)<TIMESTAMP<DATETIME 

 17.查询数据库各种sql执行频率。

                通过SHOW [session|global] STATUS LIKE 'Com_%';查看各种sql的执行频率。

                默认使用session级别,针对的是当前会话,而如果使用 show global status like 'Com_%'; 统计的结果是从数据库上次启动至今的范围。

  18.mysql设置缓存,提高性能,不用担心数据是否及时更新,因为表改变时,缓存失效

19.分析数据库的方法

              使用explain

              开启慢查询功能,记录查询时间较长的sql

              使用MySQL profile 分析

              通过SHOW [session|global] STATUS LIKE 'Com_%';查看各种sql的执行频率。

相关网址:http://blog.jobbole.com/100349/

https://blog.csdn.net/yzllz001/article/details/54848513

https://www.cnblogs.com/hanzhao1987/p/6100096.html

 https://blog.csdn.net/ty_hf/article/details/54895026

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 提高查询数据速度

    在实际项目中,通过设计表架构时,设计系统结构时,查询数据时综合提高查询数据效率 1.适当冗余 数据库在设计时遵守三范式,同时业务数据(对数据的操作,比如资料...

    用户1558882
  • flask项目开发中,遇到http 413错误

    在flask项目中,上传文件时后台报http 413 Request Entity Too Large 请求体太大错误!

    用户1558882
  • macos Item2 添加 Shell Integration (ftp传输)

    macos系统 的item2软件 的 Shell Integration (ftp传输) 功能强大,无需 安装其他ftp软件,也是为了保证 密码安全

    用户1558882
  • 知识点找回2.0

    Servlet(server Applet),全称Java Servlet, 是用java编写的服务器端程序。而这些Servlet都要实现Servlet的这个借...

    东风冷雪
  • 提高数据库查询速度的几个思路

    1、缓存,在持久层或持久层之上做缓存。 2、数据库表的大字段剥离,保证单条记录的数据量很小。 3、恰当地使用索引。 4、必要时建立多级索引。 5、分析O...

    cloudskyme
  • MySQL 数据库类型从 InnoDB 转换为 MyISAM

    魏艾斯博客www.vpsss.net
  • MySQL 基本架构概览

    下图是 MySQL 的一个简要架构图,从下图可以清晰的看到 SQL 语句在 MySQL 内部是如何执行的。

    happyJared
  • 跨域 webpack + vue-cil 中 proxyTable 处理跨域

    Krry
  • 运维建设的方向和思路

    今天和同事聊需求的时候,突然发现目前我们在做的一些系统,其实他感觉有些迷茫,主要就是一个建设的思路和方向这一块,我想了下,也确实,目前来看,其实系统的功能初期避...

    jeanron100
  • 抽象类和接口

    只声明了方法,同时使用了abstract修饰,没有方法体!必须要子类来重写!

    帅飞

扫码关注云+社区

领取腾讯云代金券