A. 如何进行sql性能优化
这里分享下mysql优化的几种方法。
1、首先在打开的软件中,需要分别为每一个表创建 InnoDB FILE的文件。
B. 搜集SQL常用的操作语句
结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
一、插入(复制)表数据
1、INSERT INTO 语句:
(1)插入新的一行数
[sql] view plain ;
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
(2)在指定的列中插入数据
[sql] view plain ;
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees');
2、SQL SELECT INTO 语句可用于创建表的备份复件
(1)在建表时复制所有数据
[sql] view plain ;
create table userinfo_new as select * from userinfo;
(2)在建表时复制部分数据
[sql] view plain ;
create table userinfo_new1 as select id,username from userinfo;
(3)在添加时复制所有数据
[sql] view plain ;
insert into userinfo_new select * from userinfo;
(4)在添加时复制部分数据
[sql] view plain ;
insert into userinfo_new(id,username) select id,username from userinfo;
二、修改表数据
Update 语句
(1)无条件更新
[sql] view plain ;
update userinfo set userpwd='111',email='[email protected]';
(2)有条件更新
[sql] view plain ;
update userinfo set userpwd='123456' where username='xxx';
三、删除表数据
1、DELETE 语句
(1)无条件删除
[sql]view plain;
daletefromuserinfo;
(2)有条件删除
[sql]view plain;
='yyy';
四、查询表数据
1、SELECT 语句:
(1)查询所有字段
[sql] view plain ;
select * from users;
(2)查询指定字段
[sql] view plain ;
select username,salary from users;
2、SELECT DISTINCT 语句
从 Company" 列中仅选取唯一不同的值,需要使用 SELECT DISTINCT 语句:
[sql] view plain ;
SELECT DISTINCT Company FROM Orders;
C. SQL优化万能公式:5 大步骤 + 10 个案例
在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL就是整个系统性能的瓶颈。
1、通过慢查日志等定位那些执行效率较低的SQL语句
2、explain 分析SQL的执行计划
type由上至下,效率越来越高
Extra
3、show profile 分析
了解SQL执行的线程的状态及消耗的时间。默认是关闭的,开启语句“set profiling = 1;”
4、trace
trace分析优化器如何选择执行计划,通过trace文件能够进一步了解为什么优惠券选择A执行计划而不选择B执行计划。
5、确定问题并采用相应的措施
案例1、最左匹配
索引
SQL语句
查询匹配从左往右匹配,要使用order_no走索引,必须查询条件携带shop_id或者索引( shop_id , order_no )调换前后顺序
案例2、隐式转换
索引
SQL语句
隐式转换相当于在索引上做运算,会让索引失效。mobile是字符类型,使用了数字,应该使用字符串匹配,否则MySQL会用到隐式替换,导致索引失效。
案例3、大分页
索引
SQL语句
对于大分页的场景,可以优先让产品优化需求,如果没有优化的,有如下两种优化方式, 一种是把上一次的最后一条数据,也即上面的c传过来,然后做“c < xxx”处理,但是这种一般需要改接口协议,并不一定可行。另一种是采用延迟关联的方式进行处理,减少SQL回表,但是要记得索引需要完全覆盖才有效果,SQL改动如下
案例4、in + order by
索引
SQL语句
in查询在MySQL底层是通过n*m的方式去搜索,类似union,但是效率比union高。in查询在进行cost代价计算时(代价 = 元组数 * IO平均值),是通过将in包含的数值,一条条去查询获取元组数的,因此这个计算过程会比较的慢,所以MySQL设置了个临界值(eq_range_index_pe_limit),5.6之后超过这个临界值后该列的cost就不参与计算了。因此会导致执行计划选择不准确。默认是200,即in条件超过了200个数据,会导致in的代价计算存在问题,可能会导致Mysql选择的索引不准确。
处理方式,可以( order_status , created_at )互换前后顺序,并且调整SQL为延迟关联。
案例5、范围查询阻断,后续字段不能走索引
索引
SQL语句
范围查询还有“IN、between”
案例6、不等于、不包含不能用到索引的快速搜索。(可以用到ICP)
在索引上,避免使用NOT、!=、>、!、NOT EXISTS、NOT IN、NOT LIKE等
案例7、优化器选择不使用索引的情况
如果要求访问的数据量很小,则优化器还是会选择辅助索引,但是当访问的数据占整个表中数据的蛮大一部分时(一般是20%左右),优化器会选择通过聚集索引来查找数据。
查询出所有未支付的订单,一般这种订单是很少的,即使建了索引,也没法使用索引。
案例8、复杂查询
如果是统计某些数据,可能改用数仓进行解决;如果是业务上就有那么复杂的查询,可能就不建议继续走SQL了,而是采用其他的方式进行解决,比如使用ES等进行解决。
案例9、asc和desc混用
desc 和asc混用时会导致索引失效
案例10、大数据
对于推送业务的数据存储,可能数据量会很大,如果在方案的选择上,最终选择存储在MySQL上,并且做7天等有效期的保存。那么需要注意,频繁的清理数据,会照成数据碎片,需要联系DBA进行数据碎片处理。
D. sql怎么读
SQL是Structured Query Language的简称,英式读法为[ˈstrʌktʃəd ˈkwɪəri ˈlæŋɡwɪdʒ]。
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL数据库的数据体系结构基本上是三级结构,但使用术语与传统关系模型术语不同。在SQL中,关系模式称为“基本表”(base table);存储模式(内模式)称为“存储文件”(stored file);子模式称为“视图”(view);元组称为“行”(row);属性称为“列”(column)。
SQL包括了所有对数据库的操作,主要是由4个部分组成:
1、数据定义:又称为“DDL语言”,定义数据库的逻辑结构,包括定义数据库、基本表、视图和索引4部分。
2、数据操纵:又称为“DML语言”,包括插入、删除和更新三种操作。
3、数据查询:又称为“DQL语言”,包括数据查询操作。
4、数据控制:又称为“DCL语言”,对用户访问数据的控制有基本表和视图的授权及回收。
5、事务控制:又称为“TCL语言”,包括事务的提交与回滚。
6、嵌入式SQL语言的使用规定:规定SQL语句在宿主语言的程序中使用的规则。
E. SQL是什么什么化语言
SQL语言简介:
结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL语句:
主要是由sql 关键字加sql对象的名称组合而成。
常见的sql操作语句有:
insert(增) update(改) delete(删除) select(查) where (条件限定关键字)
/*例:下文将创建一个基本的sql操作语句*/
----创建数据表
createtableA(keyIdint,namevarchar(20))
go
----使用insert新增数据
insertintoA(keyId,name)values(1,'a')
insertintoA(keyId,name)values(2,'b')
insertintoA(keyId,name)values(3,'c')
go
----使用update更新指定行数据
updateAsetname='test'wherekeyId=2
----使用delete删除指定行数据
deletefromAwherekeyId=1
----使用select查询数据
selectkeyId,namefromA
go
truncatetableA---清除当前测试表数据
droptableA---删除测试表结构
SQL其它连接关键字使用:
join 连接关键字:
可以通过join 关键字将两张及多张表进行连接,然后通过相应的查询条件返回连接后的集合
createtableA(keyIdintprimarykey,infovarchar(60),writeDatedatetime)
insertintoAvalues
(1,'a','2017-1-1'),
(2,'b','2017-1-2'),
(3,'c','2017-1-3')
go
createtableB(keyId2int,info2varchar(60),writeDate2datetime)
insertintoBvalues
(11,'a','2017-1-1'),
(2,'b','2017-1-2'),
(2,'b2','2017-12-2'),
(13,'c','2017-1-3'),
(1,'a2','2017-1-1')
go
/*单字段左连接进行笛卡尔运算*/
select*fromAleftjoinBona.keyId=b.keyId2
go
/*多字段左连接进行笛卡尔运算*/
select*fromAleftjoinBona.keyId=b.keyId2andA.info=b.info2
go
truncatetableA
droptableA
truncatetableB
droptableB
SQL控制关键字:
sql 脚本中常用的关键字还有 while for if else do while 等控制语句。
SQL语句:
综上所述SQL语句是由sql关键字和SQL对象名组合成sql代码。
F. SQL中的每一张表都必须设有主键吗
SQL中不是必须设置主键。
主关键字(primary key)的意思是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。
在两个表的关系中,主关键字用来在一个表中引用来自于另一个表中的特定记录,主关键字是一种唯一关键字,表定义的一部分。
一个表不能有多个主关键字,并且主关键字的列不能包含空值。主关键字是可选的,并且可在 CREATE TABLE 或 ALTER TABLE 语句中定义。主键只是说对一种表和表关系的关联而已,还有就是在建主键的时候会自动内添加个索引,某些情况下可以增加查询速度容,如果只是简单的对单表操作的话,没有必要去设置主键。
(6)sql4es扩展阅读:
结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
G. SQL的主要用途是什么
SQL(结构化查询语言)用于存取数据以及查询、更新和管理关系数据库系统。
SQL基于关系代数和元组关系演算,包括一个数据定义语言和数据操纵语言。SQL的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。尽管很大程度上是一种声明式编程(4GL),但是其也含有过程式编程的元素。
SQL是对埃德加·科德的关系模型的第一个商业化语言实现,这一模型在其1970年的一篇具有影响力的论文《一个对于大型共享型数据库的关系模型》中被描述。
尽管SQL并非完全按照科德的关系模型设计,但其依然成为最为广泛运用的数据库语言。SQL在1986年成为美国国家标准学会(ANSI)的一项标准,在1987年成为国际标准化组织(ISO)标准。此后,这一标准经过了一系列的增订,加入了大量新特性。
(7)sql4es扩展阅读:
SQL是高级的非过程化编程语言,它允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解其具体的数据存放方式。而它的界面,能使具有底层结构完全不同的数据库系统和不同数据库之间,使用相同的SQL作为数据的输入与管理。
它以记录项目〔records〕的合集(set)〔项集,record set〕作为操纵对象,所有SQL语句接受项集作为输入,回提交的项集作为输出,这种项集特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它拥有极大的灵活性和强大的功能。
在多数情况下,在其他编程语言中需要用一大段程序才可实践的一个单独事件,而其在SQL上只需要一个语句就可以被表达出来。这也意味着用SQL可以写出非常复杂的语句,在不特别考虑性能下。
H. sql语句,查询数据库里除了某一条记录外的所有记录。
1、打开sql server 可视化工具。
I. ES查询语法
参数拼接到查询路劲中查询,查询可以不指定 type 的类型
查询结果部分字段说明:
value值部分会作为整体被查询, 不会被分词, 与match做区分, match的value是会被分词作匹配查询的.
返回的文档必须满足must子句的条件,并且参与计算分值
返回的文档必须满足filter子句的条件。但是不会像Must一样,参与计算分值
返回的文档可能满足should子句的条件。在一个Bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match参数定义了至少满足几个子句, 默认情况是1
返回的文档必须不满足must_not定义的条件。
如果一个查询既有filter又有should,那么至少包含一个should子句。
bool查询也支持禁用协同计分选项disable_coord。一般计算分值的因素取决于所有的查询条件。
bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值。
使用 _source 可以只查询需要展示的列, 相当于 sql 的 select offset,methodName from ...
from表示从第几行开始,size表示查询多少条文档。from默认为0,size默认为10,
如
聚合查询的结构:
举例说明:
比如求所有文档某个字段求最大、最小、和、平均值, 可以对某个field进行计算.
以avg为例, 计算offset在所有文档中的均值
运行结果:
该聚合一般域其它 single-value 聚合联合使用,比如在计算一个字段的平均值的时候,可能还会关注这个平均值是由多少个值计算而来。
例子:统计搜索结果中maiDianType字段出现的次数
搜索结果:
基于文档的某个值(可以是特定的字段,也可以通过脚本计算而来),计算文档非重复的个数(去重计数),相当于sql中的distinct。
例子: 统计搜索结果中maiDianType出现的种类
搜索结果: maiDianType共有6种值
基于文档的某个值(可以是特定的数值型字段,也可以通过脚本计算而来),计算出一些统计信息(min、max、sum、count、avg5个值)。
例子: 基于useTime进行值统计
ps: 这个例子中是基于脚本进行的统计
统计结果:
与stats功能相似, 比stats多4个统计结果: 平方和、方差、标准差、平均值加/减两个标准差的区间
例子:
结果:
对指定字段(脚本)的值按从小到大累计每个值对应的文档数的占比(占所有命中文档数的百分比),返回指定占比比例对应的值。默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值,也可以指定分位置.
例子:
结果:
ps:
"1.0":30 代表: useTime<30的, 占比1%
"99.0":237 代表: useTime<237的, 占比99%
例子: 指定聚合的百分比
查询结果:
词聚合。基于某个field,该 field 内的每一个【唯一词元】为一个桶,每个桶内可以做再次聚合.
列子: 以prodSubNo的每个值作为聚合, 聚合结果默认排序为从大到小
搜索结果:
doc_count_error_upper_bound: //文档计数的最大偏差值
sum_other_doc_count: , //未返回的其他项的文档数
列子: 以prodSubNo的每个值作为聚合, 得到的桶继续做avg子聚合, 得到每个prodSubNo下的useTime的avg聚合结果
搜索结果:
基于一个条件,来对当前的文档进行过滤的聚合。
例子: 对查询结果进行过滤, prodSubNo=601001聚合过滤, 可对过滤后的内容进行子聚合查询, 这里使用stats统计聚合
查询结果:
基于多个过滤条件,来对当前文档进行【过滤】的聚合,每个过滤都包含所有满足它的文档(多个bucket中可能重复),先过滤再聚合。
例子: 使用prodSubNo=601001和maiDianType=script分别对索引结果进行过滤
搜索结果:
范围分组聚合。基于某个值(可以是 field 或 script),以【字段范围】来桶分聚合。范围聚合包括 from 值,不包括 to 值(区间前闭后开)。
例子: 对于useTime字段值进行0-20和20-40范围内的聚合
ps: 对范围聚合后的结果,还可以进行子聚合
搜索结果:
J. ES导致SQL注入的方式
SQL注入方法
方法1
先猜表名
And (Select count(*) from 表名)<>0
猜列名
And (Select count(列名) from 表名)<>0
或者也可以这样
and exists (select * from 表名)
and exists (select 列名 from 表名)
返回正确的,那么写的表名或列名就是正确
这里要注意的是,exists这个不能应用于猜内容上,例如and exists (select len(user) from admin)>3 这样是不行的
很多人都是喜欢查询里面的内容,一旦iis没有关闭错误提示的,那么就可以利用报错方法轻松获得库里面的内容
获得数据库连接用户名:;and user>0
方法2
后台身份验证绕过漏洞
验证绕过漏洞就是'or'='or'后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误
例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是
user=request("user")
passwd=request("passwd")
sql='select admin from adminbate where user='&'''&user&'''&' and passwd='&'''&passwd&'''
那么我使用'or 'a'='a来做用户名密码的话,那么查询就变成了
select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a'
这样的话,根据运算规则,这里一共有4个查询语句,那么查询结果就是 假or真and假or真,先算and 再算or,最终结果为真,这样就可以进到后台了
这种漏洞存在必须要有2个条件,第一个:在后台验证代码上,账号密码的查询是要同一条查询语句,也就是类似
sql="select * from admin where username='"&username&'&"passwd='"&passwd&'
如果一旦账号密码是分开查询的,先查帐号,再查密码,这样的话就没有办法了。
第二就是要看密码加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一种条件有没有可以,没有达到第一种条件的话,那就没有戏了