出现在select语句中的select语句,称为子查询或内查询。
外部的select查询语句,称为主查询或外查询。
测试数据比较多,放在我的个人博客上了。
浏览器中打开链接:http://www.itsoku.com/article/196
mysql中执行里面的 javacode2018_employees库 部分的脚本。
成功创建 javacode2018_employees 库及5张表,如下:
运行最后一条结果如下:
in,any,some,all分别是子查询的关键词之一。
in :in常用于where表达式中,其作用是查询某个范围内的数据
any和some一样 : 可以与=、>、>=、<、<=、>结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。
all :可以与=、>、>=、<、<=、>结合使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
下文中会经常用到这些关键字。
运行结果:
not in的情况下,子查询中列的值为NULL的时候,外查询的结果为空。
建议:建表是,列不允许为空。
1、mysqlslap安装:简单,装了mysql就有了
作用:模拟并发测试数据库性能。
优点:简单,容易使用。
不足:不能指定生成的数据规模,测试过程不清楚针对十万级还是百万级数据做的测试,感觉不太适合做综合测试,比较适合针对既有数据库,对单个sql进行优化的测试。
使用方法:
可以使用mysqlslap --help来显示使用方法:
Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
--concurrency代表并发数量,多个可以用逗号隔开,concurrency=10,50,100, 并发连接线程数分别是10、50、100个并发。
--engines代表要测试的引擎,可以有多个,用分隔符隔开。
--iterations代表要运行这些测试多少次。
--auto-generate-sql 代表用系统自己生成的SQL脚本来测试。
--auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的(read,write,update,mixed)
--number-of-queries 代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。
--debug-info 代表要额外输出CPU以及内存的相关信息。
--number-int-cols :创建测试表的 int 型字段数量
--auto-generate-sql-add-autoincrement : 代表对生成的表自动添加auto_increment列,从5.1.18版本开始
--number-char-cols 创建测试表的 char 型字段数量。
--create-schema 测试的schema,MySQL中schema也就是database。
--query 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
--only-print 如果只想打印看看SQL语句是什么,可以用这个选项。
mysqlslap -umysql -p123 --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam --number-of-queries=10 --debug-info
或:
指定数据库和sql语句:
mysqlslap -h192.168.3.18 -P4040 --concurrency=100 --iterations=1 --create-schema='test' --query='select * from test' --number-of-queries=10 --debug-info -umysql -p123
要是看到底做了什么可以加上:--only-print
Benchmark
Average number of seconds to run all queries: 25.225 seconds
Minimum number of seconds to run all queries: 25.225 seconds
Maximum number of seconds to run all queries: 25.225 seconds
Number of clients running queries: 100
Average number of queries per client: 0
以上表明100个客户端同时运行要25秒
2、sysbench
安装:
可以从http://sourceforge.net/projects/sysbench/ 下载
tar zxf sysbench-0.4.12.tar.gz
cd sysbench-0.4.12
./autogen.sh
./configure &&make &&make install
strip /usr/local/bin/sysbench
安装时候可能会报错,后来baidu发现个好文 http://blog.csdn.net/icelemon1314/article/details/7004955 怕以后找不到,也贴过来吧
1.如果mysql不是默认路径安装,那么需要通过指定--with-mysql-includes和--with-mysql-libs参数来加载mysql安装路径
2.如果报错:
../libtool: line 838: X--tag=CC: command not found
../libtool: line 871: libtool: ignoring unknown tag : command not found
../libtool: line 838: X--mode=link: command not found
../libtool: line 1004: *** Warning: inferring the mode of operation is deprecated.: command not found
../libtool: line 1005: *** Future versions of Libtool will require --mode=MODE be specified.: command not found
../libtool: line 2231: X-g: command not found
../libtool: line 2231: X-O2: command not found
那么执行下根目录的:autogen.sh文件,然后重新configure &&make &&make install
3.如果报错:
sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
那么执行下:
n -s /usr/local/mysql5.5/mysql/lib/libmysqlclient.so.18 /usr/lib64/
4.如果执行autogen.sh时,报如下错误:
./autogen.sh: line 3: aclocal: command not found
那么需要安装一个软件:
yum install automake
然后需要增加一个参数:查找: AC_PROG_LIBTOOL 将其注释,然后增加AC_PROG_RANLIB
作用:模拟并发,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL
优点:可以指定测试数据的规模,可以单独测试读、写的性能,也可以测试读写混合的性能。
不足:测试的时候,由于网络原因,测试的非常慢,但是最终给的结果却很好,并发支持很高,所以给我的感觉是并不太准确。当然也可能我没搞明白原理
使用方法:
准备数据
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=400000 --mysql-db=dbtest2 --mysql-user=root --mysql-host=192.168.1.101 --mysql-password=pwd prepare
执行测试
sysbench --num-threads=100 --max-requests=4000 --test=oltp --mysql-table-engine=innodb --oltp-table-size=400000 --mysql-db=dbtest1 --mysql-user=root --mysql-host=192.168.1.101 --mysql-password=pwd run
sysbench 0.4.12: multi-threaded system evaluation benchmark
No DB drivers specified, using mysql
Running the test with following options:
Number of threads: 100
Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 4000
Threads started!
Done.
OLTP test statistics:
queries performed:
read: 56014
write: 20005
other: 8002
total: 84021
transactions: 4001 (259.14 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 76019 (4923.75 per sec.)
other operations: 8002 (518.29 per sec.)
Test execution summary:
total time: 15.4393s
total number of events: 4001
total time taken by event execution: 1504.7744
per-request statistics:
min: 33.45ms
avg: 376.10ms
max: 861.53ms
approx. 95 percentile: 505.65ms
Threads fairness:
events (avg/stddev): 40.0100/0.67
execution time (avg/stddev): 15.0477/0.22
3、tpcc-mysql
安装:
如果从原网站上下载源码比较麻烦,需要工具、注册、生成证书等。这里提供一个下载包http://blog.chinaunix.net/blog/downLoad/fileid/8532.html
export C_INCLUDE_PATH=/usr/include/mysql
export PATH=/usr/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib/mysql
cd /tmp/tpcc/src
make
然后就会在 /tmp/tpcc-mysql 下生成 tpcc 命令行工具 tpcc_load 、 tpcc_start
作用:测试mysql数据库的整体性能
优点:符合tpcc标准,有标准的方法,模拟真实的交易活动,结果比较可靠。
不足:不能单独测试读或者写的性能,对于一些以查询为主或者只写的应用,就没有这么大的意义了。
使用方法:
加载数据
创建库
mysql>create database tpcc10
创建表:
shell>mysql tpcc10 <create_table.sql
添加外键:
shell>mysql tpcc10 <add_fkey_idx.sql
加载数据:
1、单进程加载:
shell>./tpcc_load 192.168.11.172 tpcc10 root pwd 300
|主机||数据库||用户||密码||warehouse|
2、并发加载:(推荐,但需要修改一下)
shell>./load.sh tpcc300 300
|数据库||warehouse|
3、测试
./tpcc_start -h192.168.11.172 -d tpcc -u root -p 'pwd' -w 10 -c 10 -r 10 -l 60 -i 10 -f /mnt/hgfs/mysql/tpcc100_2013522.txt
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
option h with value '192.168.11.172'
option d with value 'tpcc'
option u with value 'root'
option p with value 'pwd'
option w with value '1'
option c with value '100'
option r with value '120'
option l with value '60'
option i with value '10'
option f with value '/mnt/hgfs/mysql/tpcc100_2013522.txt'
<Parameters>
[server]: 192.168.11.172
[port]: 3306
[DBname]: tpcc
[user]: root
[pass]: pwd
[warehouse]: 1
[connection]: 100
[rampup]: 120 (sec.)
[measure]: 60 (sec.)
RAMP-UP TIME.(120 sec.)
MEASURING START.
在上一文章 《 【技术干货】作为测试,你必须知道的MySQL知识(一) 》 中我们已经学了MySQL基础知识。对于 最常用、最重要 的select语句将会在本文与大家分享,带你轻松搞定查询语句。学习select之前,需先知道查询语句 逻辑执行顺序 ,了解了逻辑执行顺序,对我们写select语句有帮助,但是需要注意的是,逻辑顺序并不是真正执行的顺序,因为MySQL 优化器 会将SQL子句按最优的路径执行。如果想要查看实际执行顺序,可使用Explain关键字进行分析,获取对应的执行计划。
查询语句的使用都离不开以下的格式:
需要记住,这是学好查询语句的基础~
以上select的逻辑执行顺序如下(前面的序号):
查询语句中where后面支持多种运算符,进行条件的处理,其中常见运算符包括:比较运算、逻辑运算、模糊查询、范围查询、空判断。
① 等于: =
② 大于: >
③ 大于等于: >=
④ 小于: <
⑤ 小于等于: <=
⑥ 不等于: != 或 <>
① and
② or
③ not
【模糊查询语法】:字段名 like <匹配字段字符串>
【常见的匹配字段字符串】:%、_、[] 、[^]
① in:表示在一个非连续的范围内
② between ... and ...:表示在一个连续的范围内
① 判断为空:is null
② 判断非空:is not null
【注意】:null与''是不同的。
使用JOIN 来联合多表查询,JOIN 按照功能大致分为如下三类:
① INNER JOIN(内连接) : 获取两个表中字段匹配关系的记录。
② LEFT JOIN(左连接) : 获取左表所有记录,即使右表没有对应匹配的记录。
③ RIGHT JOIN(右连接) : 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
->【举个栗子】:对表t_user与表t_order进行内连接
->【举个栗子】:对表t_user与表t_order进行左连接
->【举个栗子】:对表t_user与表t_order进行右连接
① 内连接: 保留两表中交集的记录;
② 左连接: 左表全部保留,右表关联不上用null表示;
③ 右连接: 右表全部保留,左表关联不上的用null表示。
group by语句是根据一个或多个列对结果集进行分组。在分组的列上我们经常会使用到 聚合函数 ,因此,先了解 常用的聚合函数 :
① sum():求和
② avg():求平均数
③ count():统计记录条数
④ max():求最大值
⑤ min():求最小值
【group by语法】:
可以根据某个字段(column_name)进行分组。如果不指定分组字段,默认将所有记录作为一组。
->【举个栗子】: 在emp表中,有3个字段,一个是员工id(id),一个是部门id(dept_id),一个是员工薪水(salary)
【注意】:
① 使用group by的select语句中的字段,应该 出现在 聚合函数 中,或者 出现在 group by 中;
② having 子句可以使用聚合函数,而 where 子句不能使用。
③从逻辑执行过程可知: where 是没有分组前对所有数据进行过滤, having 是对分组后的数据进行过滤。
子查询是指一个查询语句嵌套在另一个查询语句内部的查询。
->【举个栗子】: 一张user表,有2个字段,一个是名称(name),一个是年龄(age),查询出比小李年龄高的人有哪些?
- >【举个栗子】: 获取员工工资低于所在部门的平均工资的员工信息
要对某个字段进行降序,可以在查询语句后可使用:order by <排序的字段名>desc
要对某个字段进行升序,可以在查询语句后可使用:order by <排序的字段名>asc
【注意】:order by默认情况下是升序,asc可省略不写。
有2个维度的排序时,使用逗号隔开2个排序,优先使用前者进行排序,再使用后者进行排序。
limit:限制查询数据条数,经常在分页的场景中应用。LIMIT子句接受一个或两个参数。参数值都必须为零或正整数。limit的使用格式:
【参数解释】:
limit N : 返回 N 条记录
offset M : 跳过 M 条记录, 默认 M=0
limit N,M : 从第 N 条记录开始, 返回 M 条记录。
->【举个栗子】:
【注意】:limit的两个参数中:
① 第1个参数:指要返回的第一行的偏移量。第一行的偏移量为0,而不是1;
② 第2个参数:指要返回的记录行数。
如上面"检索6-15行记录"例子中,第1个参数为5,其实指的是第6行;第2个参数为10,指的是从第6行开始,取10条记录,所以是获取到6-15的记录。
当需要查询出某个字段不重复的记录时,可以使用distinct来过滤重复的记录,格式如下:
使用distinct可以进行单字段去重、多字段去重、所有字段去重、以及与聚合函数的综合使用。
-->【举个栗子】: student表中有name、age、weight3个字段字段。
使用distinct之后,只能返回去重的字段,而不能返回其他的字段,可以使用group by进行去重查询,
【注意】:
① distinct 只能在select语句中使用;
② distinct 必须在所有字段的最前面;
③ 多个字段去重时,多个字段组合后一样时才会被去重;
④ 列中有null值,当对该列使用distinct子句,将保留一个null值(所有null值被视为相同的值)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)