mysql扩展使用_mysql的扩展应用

sql优化:

1、硬件优化

sql服务器的机械硬盘换成固态硬盘,mysql升级更高的版本

2、软件优化

设计数据库符合三范式(3nf)标准

建立有效的索引

编写查询语句时,用什么字段拿什么字段

中间层优化,把常用的不经常改变的数据放到缓存里,直接去缓存拿数据,缓存中没有再去数据库拿

防sql注入:

1、对输入的数据进行过滤,对发送到数据库的数据进行转义

if(!get_magic_quotes_gpc()){ //判断是否开启

$newStr=addslashes($str); //然后用addslashes函数过滤

}

2、过滤一些常见的数据库操作关键字

$post = implode(',',$_POST);

preg_match('/select|insert|update|delete|and|or|create|alter|count|union|into|

load_file|outfile|'|''/i',$post) // 进行过滤

3、使用pdo预处理机制

跨站脚本的过滤:

RemoveXSS($post['name']);(RemoveXss是自己封装的函数)

join(连接):

select a.id,a.name,a.age,b.sex from 表A a LEFT JOIN 表B b on a.id = b.typeId;

说明:LEFT JOIN 左连接,除了获取符合的数据外,还获取左表的全部数据(字段的值不重复,若重复,后面的值覆盖前面的值),若右表无对应数据,则该字段的值显示为NULL

时间搜索:

?>

mysql的悲观锁和乐观锁:

乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。

mysql的索引:

索引类型:

normal:表示普通索引

unique:表示唯一索引,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique

full textl: 表示全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。

总结,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。

索引方法(Innodb和MyISAM默认的索引是Btree索引):

HASH(用于对等比较,如"="和" <=>")   //<=> 安全的比对   ,用与对null值比较,语义类似is     null()

BTREE(用于非对等比较,比如范围查询)>,>=,

复合索引:

两个或更多个列以上的索引被称作复合索引。

利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。

复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

注意:

复合索引建立之后,索引列中的第一个字段索引就可以取消设置了;因为单独查询索引字段时,SQL会直接走复合索引而不会走独立索引

举例1:

复合索引字段   index 【status,name,price,type,time】

where条件    status = 1

他也可以走这个index索引(因为status字段在索引的的首位)

举例2:

复合索引字段   index 【status,name,price,type,time】

where条件  status = 1 and time > 1555555555

他也可以走这个index索引(按照字段顺序能找到对应字段)

举例3:

复合索引字段   index 【status,name,price,type,time】

where条件  status = 1 and price> 10.99 and name = 'zhangsan'

他不走这个index索引(没有按照字段的顺序)

总结:

如果复合索引使用效果不好(速度是否有提升,是否影响其他索引条件),设置独立索引,反之亦然

mysql语句的优化分析(explain):

mysql的where计算次序优先级:

非(!)>与(&&)>或(||)

解决方法:使用圆括号明确地分组相应的操作符,就不会走优先级

(id >1 or name='zhangsan')and sex='nan'

提示:

任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符,不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此;使用圆括号没有什么坏处,它能消除歧义。

mysql的正则表达式:

where name REGEXP'1000|2000'

语句中使用了正则表达式1000|2000,|为正则表达式的OR操作符,它表示匹配其中之一,因此1000和2000都匹配并返回。

mysql的慢查询日志:

什么是慢查询?

答:在MySQL数据库中慢查询是在日志中记录执行速度慢的SQL语句,这个功能需要被开启才能被使用。在Windows系统下的MySQL 配置文件一般是是my.ini找到[mysqld]下面加上

代码如下:

slow_query_log=on

slow_query_log_file = D:/phpstudy_pro/Extensions/MySQL8.0.12/data/slow_man.log

long_query_time = 1

2. 在Linux系统下的MySQL

配置文件一般是是my.cnf找到[mysqld]下面加上

代码如下:

slow_query_log=on

slow_query_log_file = /var/lib/mysql/logs/slow.log

long_query_time = 1

说明:long_query_time是指执行超过多久的SQL会被日志记录下来,这里是10 秒;

log-slow-queries设置把日志写在那里(例子中慢查询日志会写到文件/var/lib/mysql/mysql-slow.log中),为空的时候,

系统会给慢查询日志赋予主机名,并加上slow.log。如果设置了参数log-long-format ,那么所有没有使用索引的查询也将被记录。

这个日志对性能的影响不大(所有的查询耗时都很小的情况下),并且强调了那些需要在意的查询(从结果中可以分析出那些查询SQL语句需要优化或者那些索引需要添加或者那些索引没有失效了)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值