pymysql操作数据库

简单操作

  1. import pymysql # pip install pymysql
  2. # 连接数据库的参数
  3. conn = pymysql.connect(host= 'localhost',
  4. user='root',
  5. password = '123',
  6. database='db3',
  7. charset = 'utf8')
  8. # cursor = conn.cursor() # <pymysql.cursors.Cursor object at 0x000000000A0E2C50>,游标对象,默认返回的值是元祖类型
  9. cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) # <pymysql.cursors.DictCursor object at 0x000000000A0E2C88> 返回的值是字典类型
  10. # print(cursor)
  11. sql = "select name from userinfo where id>10"
  12. cursor.execute(sql)
  13. res= cursor.fetchall() # #取出所有的数据 返回的是列表套字典
  14. # res = cursor.fetchone() # 只获取一条数据
  15. # res = cursor.fetchmany(size) # 可指定参数, 取出size条数据 返回的是列表套字典
  16. print(res)
  17. cursor.close()
  18. conn.close()
  19. '''
  20. [{'name': '丁丁'}, {'name': '星星'}, {'name': '格格'}, {'name': '张野'}, {'name': '程咬金'}, {'name': '程咬银'}, {'name': '程咬铜'}, {'name': '程咬铁'}]
  21. '''

sql的注入问题

  1. import pymysql
  2. user = input('输入用户名:').strip()
  3. password = input('输入密码:').strip()
  4. # 连接数据库的参数
  5. conn = pymysql.connect(host= 'localhost',
  6. user='root',
  7. password = '123',
  8. database='db3',
  9. charset = 'utf8')
  10. # cursor = conn.cursor() # <pymysql.cursors.Cursor object at 0x000000000A0E2C50>,游标对象,默认返回的值是元祖类型
  11. cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) # <pymysql.cursors.DictCursor object at 0x000000000A0E2C88> 返回的值是字典类型
  12. # print(cursor)
  13. sql = "select * from user where name='%s' and password='%s'"%(user,password)
  14. print(sql)
  15. # exit()
  16. cursor.execute(sql)
  17. res= cursor.fetchall() # #取出所有的数据 返回的是列表套字典
  18. # res = cursor.fetchone() # 只获取一条数据
  19. # res = cursor.fetchmany(size) # 可指定参数, 取出size条数据 返回的是列表套字典
  20. print(res)
  21. if res:
  22. print('登录成功!')
  23. else:
  24. print('登录失败!')
  25. cursor.close()
  26. conn.close()
  27. '''
  28. 输入用户名:zhang' #
  29. 输入密码:123
  30. select * from user where name='zhang' #' and password='123'
  31. [{'name': 'zhang', 'password': '123 '}]
  32. 登录成功!
  33. '''
  34. '''
  35. 输入用户名:zhang' or 1=1 #
  36. 输入密码:123
  37. select * from user where name='zhang' or 1=1 #' and password='123'
  38. [{'name': 'zhang', 'password': '123 '}]
  39. 登录成功!
  40. '''
  41. # 输入用户名的时候,输入‘#’将后面的密码验证部分注释掉了,语句变成了select * from user where name='zhang' 或者 select * from user where name='zhang' or 1=1,直接跳过了密码的验证环节,出现了sql语句的注入问题。

sql注入问题解决办法

  1. # 出现sql注入问题主要是我们对用户输入没有做合法性验证,
  2. # 方法1:如果对用户输入的值进行判断或者转译,检查完之后或者转译后就不会出现此类问题了。这样低级安全问题不该出现!
  3. # 方法2:将参数以元组或列表的形式传入execute中,让它帮我们转译和检验;即:cursor.execute(sql,(user,password))
  4. import pymysql
  5. user = input('输入用户名:').strip()
  6. password = input('输入密码:').strip()
  7. # 连接数据库的参数
  8. conn = pymysql.connect(host= 'localhost',
  9. user='root',
  10. password = '123',
  11. database='db3',
  12. charset = 'utf8')
  13. # cursor = conn.cursor() # <pymysql.cursors.Cursor object at 0x000000000A0E2C50>,游标对象,默认返回的值是元祖类型
  14. cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) # <pymysql.cursors.DictCursor object at 0x000000000A0E2C88> 返回的值是字典类型
  15. # print(cursor)
  16. sql = "select * from user where name=%s and password=%s"
  17. print(sql)
  18. # exit()
  19. cursor.execute(sql,(user,password))
  20. res= cursor.fetchall() # #取出所有的数据 返回的是列表套字典
  21. # res = cursor.fetchone() # 只获取一条数据
  22. # res = cursor.fetchmany(size) # 可指定参数, 取出size条数据 返回的是列表套字典
  23. print(res)
  24. if res:
  25. print('登录成功!')
  26. else:
  27. print('登录失败!')
  28. cursor.close()
  29. conn.close()
  30. '''
  31. 输入用户名:zhang
  32. 输入密码:123
  33. select * from user where name=%s and password=%s
  34. [{'name': 'zhang', 'password': '123 '}]
  35. 登录成功!
  36. '''
  37. '''
  38. 输入用户名:zhang' #
  39. 输入密码:123
  40. select * from user where name=%s and password=%s
  41. ()
  42. 登录失败!
  43. '''

sql注入问题模板总结


  1. 产生的原因:
  2. 因为过于相信用户输入的内容, 根本没有做任何的检验
  3. 解决的方法:
  4. sql = "select * from user where name=%s and password=%s"
  5. # execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了
  6. cursor.execute(sql, (user, pwd))
  7. 连接:
  8. ### 连接数据库的参数
  9. conn = pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8')
  10. # cursor = conn.cursor() ### 默认返回的值是元祖类型
  11. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********)
  12. 查:
  13. fetchall() 取出所有的数据 返回的是列表套字典
  14. fetchone() 取出一条数据 返回的是字典
  15. fetchmany(size) 取出size条数据 返回的是列表套字典

利用pymysql操作数据库 (增删改),conn.commit()

  1. # 插入
  2. import pymysql
  3. # 连接数据库的参数
  4. conn = pymysql.connect(host= 'localhost',
  5. user='root',
  6. password = '123',
  7. database='db3',
  8. charset = 'utf8')
  9. cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
  10. sql = "insert into user(name,password) values(%s,%s)"
  11. print(sql) # insert into user(name,password) values(%s,%s)
  12. # cursor.execute(sql,("tank",'qwe')) # 插入单条
  13. data=[('小王','111'),('小张','222'),('小李','333'),('小张','444'),]
  14. cursor.executemany(sql,data) # 插入多条
  15. conn.commit()
  16. cursor.close()
  17. conn.close()
  18. # 插入单条情况下
  19. '''
  20. mysql> select * from user;
  21. +-------+----------+
  22. | name | password |
  23. +-------+----------+
  24. | zhang | 123 |
  25. | tank | qwe |
  26. +-------+----------+
  27. 2 rows in set (0.00 sec)
  28. '''
  29. # 插入多条情况下
  30. '''
  31. mysql> select * from user;
  32. +--------+----------+
  33. | name | password |
  34. +--------+----------+
  35. | zhang | 123 |
  36. | tank | qwe |
  37. | tank | qwe |
  38. | 小王 | 111 |
  39. | 小张 | 222 |
  40. | 小李 | 333 |
  41. | 小张 | 444 |
  42. +--------+----------+
  43. 7 rows in set (0.00 sec)
  44. '''
  1. # 修改
  2. 先给user表增加一个id索引字段;
  3. mysql> alter table user add id int primary key auto_increment FIRST;
  4. Query OK, 0 rows affected (0.50 sec)
  5. Records: 0 Duplicates: 0 Warnings: 0
  6. mysql> select * from user;
  7. +----+--------+----------+
  8. | id | name | password |
  9. +----+--------+----------+
  10. | 1 | zhang | 123 |
  11. | 2 | tank | qwe |
  12. | 3 | tank | qwe |
  13. | 4 | 小王 | 111 |
  14. | 5 | 小张 | 222 |
  15. | 6 | 小李 | 333 |
  16. | 7 | 小张 | 444 |
  17. +----+--------+----------+
  18. 7 rows in set (0.00 sec)
  19. # 进行修改操作 将 id=6 的记录的 name 字段的名字修改为 ‘小李子’
  20. import pymysql
  21. # 连接数据库的参数
  22. conn = pymysql.connect(host= 'localhost',
  23. user='root',
  24. password = '123',
  25. database='db3',
  26. charset = 'utf8')
  27. cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
  28. sql = "update user set name = %s where id = %s"
  29. cursor.execute(sql,('小李子',6)) # 插入多条
  30. conn.commit()
  31. cursor.close()
  32. conn.close()
  33. '''
  34. mysql> select * from user;
  35. +----+-----------+----------+
  36. | id | name | password |
  37. +----+-----------+----------+
  38. | 1 | zhang | 123 |
  39. | 2 | tank | qwe |
  40. | 3 | tank | qwe |
  41. | 4 | 小王 | 111 |
  42. | 5 | 小张 | 222 |
  43. | 6 | 小李子 | 333 |
  44. | 7 | 小张 | 444 |
  45. +----+-----------+----------+
  46. 7 rows in set (0.00 sec)
  47. '''
  1. # 删除
  2. import pymysql
  3. # 连接数据库的参数
  4. conn = pymysql.connect(host= 'localhost',
  5. user='root',
  6. password = '123',
  7. database='db3',
  8. charset = 'utf8')
  9. cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
  10. sql = "delete from user where id>%s"
  11. cursor.execute(sql,6) # 插入多条
  12. conn.commit()
  13. cursor.close()
  14. conn.close()
  15. '''
  16. mysql> select * from user;
  17. +----+-----------+----------+
  18. | id | name | password |
  19. +----+-----------+----------+
  20. | 1 | zhang | 123 |
  21. | 2 | tank | qwe |
  22. | 3 | tank | qwe |
  23. | 4 | 小王 | 111 |
  24. | 5 | 小张 | 222 |
  25. | 6 | 小李子 | 333 |
  26. +----+-----------+----------+
  27. 6 rows in set (0.00 sec)
  28. '''

索引

1.为何要有索引

一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了

2.什么是索引?

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能

非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。

索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。

索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

3.索引使用的优缺点

若索引太多,应用程序的性能可能会受到影响。而索引太少,对查询性能又会产生影响,要找到一个平衡点,这对应用程序的性能至关重要。当然索引也并不是越多越好,我曾经遇到过这样一个问题:某台MySQL服务器iostat显示磁盘使用率一直处于100%,经过分析后发现是由于开发人员添加了太多的索引,在删除一些不必要的索引之后,磁盘使用率马上下降为20%。可见索引的添加也是非常有技术含量的。下面会细讲创建索引的优缺点

优点:提高查询效率;缺点:加了索引之后,会占用大量的磁盘空间,创建索引时会消耗大量时间。

4.索引原理

B+树

本质是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据

  1. # 插入3000,000条数据做实验 哈哈哈哈 !!!!
  2. import pymysql
  3. # 连接数据库的参数
  4. conn = pymysql.connect(host= 'localhost',
  5. user='root',
  6. password = '123',
  7. database='db3',
  8. charset = 'utf8')
  9. cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
  10. l=[]
  11. for i in range(3000000):
  12. res=(f'小张{i}',str(i))
  13. l.append(res)
  14. sql = "insert into user(name,password) values(%s,%s)"
  15. cursor.executemany(sql,l) # 插入多条
  16. conn.commit()
  17. cursor.close()
  18. conn.close()
  19. '''
  20. | 1033019 | 小张2829 | 2829 |
  21. | 1033020 | 小张2830 | 2830 |
  22. | 1033021 | 小张2831 | 2831 |
  23. | 1033022 | 小张2832 | 2832 |
  24. | 1033023 | 小张2833 | 2833 |
  25. | 1033024 | 小张2834 | 2834 |
  26. | 1033025 | 小张2835 | 2835 |
  27. | 1033026 | 小张2836 | 2836 |
  28. | 1033027 | 小张2837 | 2837 |
  29. | 1033028 | 小张2838 | 2838 |
  30. | 1033029 | 小张2839 | 2839 |
  31. | 1033030 | 小张2840 | 2840 |
  32. | 1033031 | 小张2841 | 2841 |
  33. | 1033032 | 小张2842 | 2842 |
  34. | 1033033 | 小张2843 | 2843 |
  35. | 1033034 | 小张2844 | 2844 |
  36. | 1033035 | 小张2845 | 2845 |
  37. | 1033036 | 小张2Ctrl-C -- sending "KILL QUERY 1" to server ...
  38. 846 Ctrl-C -- query aborted.
  39. | 2846 |
  40. +---------+---------------+----------+
  41. 3000006 rows in set (2.46 sec)
  42. '''

5.索引的种类

  1. 索引的种类:(**************************)
  2. 主键索引: 加速查找 + 不能重复 + 不能为空 primary key
  3. 唯一索引: 加速查找 + 不能重复 unique(name)
  4. 联合唯一索引:unique(name, email)
  5. 例子:
  6. zekai 123@qq.com
  7. zekai 123@qq.cmm
  8. 普通索引: 加速查找 index (name)
  9. 联合索引: index (name, email)

6.索引的创建

主键索引

  1. 主键索引:表设置了主键的情况下,才能设置auto_increment,否则报错;删除主键,主键设置有auto_increment情况下,先将其删除,否则无法删除主键primary key
  2. 新增主键索引:
  3. create table xxx(
  4. id int auto_increment ,
  5. primary key(id)
  6. )
  7. 改:
  8. # change不仅可以修改字段类型和约束条件,还可以修改字段名字;
  9. alter table xxx change id id int auto_increment primary key;
  10. # 只能修改字段类型和约束条件
  11. alter table xxx modify id int auto_increment primary key; # 同上
  12. alter table t1 add primary key (id);
  13. 删除主键索引:
  14. mysql> alter table t1 drop primary key;

唯一索引

  1. 唯一索引:
  2. 1.新增:
  3. create table t2(
  4. id int primary key auto_increment,
  5. name varchar(32) not null default '',
  6. unique u_name (name) # 为了后续删除方便,unique(唯一索引)单写一行,并起别名(u_name),否则后续无法删除;
  7. )charset utf8;
  8. 2.增:
  9. CREATE UNIQUE INDEX 索引名 ON 表名 (字段名) ;
  10. create unique index ix_name on t2(name);
  11. 3.改:
  12. alter table t2 add unique index ix_name (name)
  13. 4.删除:
  14. alter table t2 drop index u_name;

普通索引

  1. 普通索引:
  2. 1.新增:
  3. create table t3(
  4. id int primary key auto_increment ,
  5. name varchar(32) not null default '',
  6. index u_name (name) # 为了后续删除方便,indexe(普通索引)单写一行,并起别名(u_name),否则后续无法删除;
  7. )charset utf8;
  8. 2.增:
  9. CREATE INDEX 索引名 ON 表名 (字段名) ;
  10. create index ix_name on t3(name);
  11. 3.改:
  12. alter table t3 add index ix_name (name)
  13. 4.删除:
  14. alter table t3 drop index u_name;

  1. 索引的优缺点:
  2. 通过以上图片中 *.ibd文件可知:
  3. 1.索引加快了查询速度
  4. 2.但加了索引之后,会占用大量的磁盘空间
  5. 3.当数据量大时,给某个字段创建索引会花费大量时间。

7.不会命中索引的情况

没命中索引,会降低SQL的查询效率;

1.SQl语句中,进行四则运算;

  1. mysql> desc user;
  2. +----------+-------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +----------+-------------+------+-----+---------+----------------+
  5. | id | int(11) | NO | PRI | NULL | auto_increment |
  6. | name | varchar(32) | NO | | NULL | |
  7. | password | varchar(10) | NO | | NULL | |
  8. +----------+-------------+------+-----+---------+----------------+
  9. 3 rows in set (0.01 sec)
  10. mysql> select count(*) from user where id=1500000;
  11. +----------+
  12. | count(*) |
  13. +----------+
  14. | 1 |
  15. +----------+
  16. 1 row in set (0.00 sec)
  17. # 索引字段id,参与了计算,无法拿到一个明确的值去索引树中查找,每次都得临时计算一下。
  18. mysql> select count(*) from user where id*3=1500000;
  19. +----------+
  20. | count(*) |
  21. +----------+
  22. | 0 |
  23. +----------+
  24. 1 row in set (2.00 sec)

2.使用函数

  1. mysql> alter table user add index ix_name_psw(name,password); # 给name,password建立联合索引;
  2. Query OK, 0 rows affected (18.01 sec)
  3. Records: 0 Duplicates: 0 Warnings: 0
  4. mysql> select * from user where reverse(name)='小张1'; # 使用函数
  5. Empty set (1.40 sec) # 使用函数用时1.4s
  6. mysql> select * from user where name='小张1'; # 未使用函数
  7. +---------+---------+----------+
  8. | id | name | password |
  9. +---------+---------+----------+
  10. | 1030191 | 小张1 | 1 |
  11. +---------+---------+----------+
  12. 1 row in set (0.00 sec) # 未用函数用时0.0s

3.查询时,使用字段的类型不一致;

  1. mysql> select * from user where name='小张8888'; # 定义name是字符串类型,用字符串查询;
  2. +---------+------------+----------+
  3. | id | name | password |
  4. +---------+------------+----------+
  5. | 1039078 | 小张8888 | 8888 |
  6. +---------+------------+----------+
  7. 1 row in set (0.00 sec)
  8. mysql> select * from user where name=8888; # 定义name是字符串类型,用整型查询;
  9. Empty set, 65535 warnings (1.91 sec)

4.排序(order by)条件为索引,select字段不是索引字段

  1. mysql> desc user;
  2. +----------+-------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +----------+-------------+------+-----+---------+----------------+
  5. | id | int(11) | NO | PRI | NULL | auto_increment |
  6. | name | varchar(32) | NO | MUL | NULL | |
  7. | password | varchar(10) | NO | | NULL | |
  8. +----------+-------------+------+-----+---------+----------------+
  9. 3 rows in set (0.01 sec)
  10. # 有索引的情况下,默认这一列是已经排过序的,order by直接按照索引的排序往下走,所以速度快些。
  11. mysql> select name from user order by name; # 排序字段(有索引)与select字段一样
  12. +---------------+
  13. | name |
  14. +---------------+
  15. | tank |
  16. | tank |
  17. | zhang |
  18. |....... |
  19. ........
  20. .......
  21. ......
  22. | 小张1000023 |
  23. | 小张1000024 |
  24. | 小张1000025 |
  25. | Ctrl-C -- sending "KILL QUERY 2" to server ...
  26. Ctrl-C -- query aborted.
  27. 1000026 |
  28. +---------------+
  29. 3000006 rows in set (1.89 sec)
  30. # password没有索引,order by 要重新排序
  31. mysql> select name from user order by password desc; # 排序字段(没索引)与select字段(有索引)不一样
  32. +---------------+
  33. | name |
  34. +---------------+
  35. | 小张0 |
  36. | 小张1 |
  37. | 小张10 |
  38. | 小张100 |
  39. | 小张100001 |
  40. | 小张1000010 |
  41. | 小张1Ctrl-C -- sending "KILL QUERY 2" to server ...
  42. 00Ctrl-C -- query aborted.
  43. 0011 |
  44. +---------------+
  45. 3000006 rows in set (6.06 sec) # 明显查询时间延长;
  46. 特别的:如果对主键排序,则速度还是很快:
  47. select * from tb1 order by id desc;

5.组合索引最左前缀

什么时候会创建联合索引?

​ 根据公司的业务场景, 在最常用的几列上添加索引

select * from user where name='zekai' and email='zekai@qq.com';

  1. 如果遇到上述业务情况, 错误的做法:
  2. index ix_name (name),
  3. index ix_psw(password)
  4. 正确的做法:
  5. index ix_name_psw(name, password)
  6. 如果组合索引为:index ix_name_psw(name, password)
  7. where name='小张' and password='xxxx' -- 命中索引
  8. where name='小张' -- 命中索引
  9. where password=222 -- 未命中索引
  10. 例子:
  11. index (a,b,c,d)
  12. where a=2 and b=3 and c=4 and d=5 --->命中索引
  13. # 最左前缀匹配,几个字段建立联合索引,命中索引必须是从最左边字段连续的几个字段。
  14. where a=2 and c=3 and d=4 ----> 未命中

8.explain (显示检测报告)

explain通过显示信息,判断我们写的SQL语句是否用到了我们添加的的这个字段的索引,给我们一份报告,我们我们通过报告结果去优化自己写的SQL语句。

方法1:

  1. mysql> explain select * from user where name='小张1' and password=1; # 以表格形式展示

方法2:

  1. # 命中索引
  2. mysql> explain select * from user where name='小张'\G # 末尾不用加分号
  3. # 以报告单的形式显示
  4. *************************** 1. row ***************************
  5. id: 1
  6. select_type: SIMPLE
  7. table: user
  8. type: ref
  9. possible_keys: ix_name_psw
  10. key: ix_name_psw
  11. key_len: 98
  12. ref: const
  13. rows: 1 # 扫描的长度,3000,000行数据值扫描了一行就拿到了数据。
  14. Extra: Using where; Using index
  15. 1 row in set (0.00 sec)
  16. # 命中索引
  17. mysql> explain select * from user where name='小张' and password=222\G # 末尾不用加分号
  18. *************************** 1. row ***************************
  19. id: 1
  20. select_type: SIMPLE
  21. table: user
  22. type: ref # 索引指向 all
  23. possible_keys: ix_name_psw # 可能用到的索引
  24. key: ix_name_psw # 确实用到的索引
  25. key_len: 98 # 索引长度
  26. ref: const
  27. rows: 1 # 扫描的长度,3000,000行数据值扫描了一行就拿到了数据。
  28. Extra: Using where; Using index # 使用到了索引
  29. 1 row in set (0.00 sec)
  30. # 之前已经对name和password建立了联合索引,但是单独使用password作为查询条件,并没有命中索引,扫描行数就会增加;
  31. mysql> select * from user where password=222;
  32. +---------+-----------+----------+
  33. | id | name | password |
  34. +---------+-----------+----------+
  35. | 5 | 小张 | 222 |
  36. | 1030412 | 小张222 | 222 |
  37. +---------+-----------+----------+
  38. 2 rows in set, 2 warnings (1.60 sec)
  39. mysql> explain select * from user where password=222\G
  40. *************************** 1. row ***************************
  41. id: 1
  42. select_type: SIMPLE
  43. table: user
  44. type: index
  45. possible_keys: NULL # 表示没有使用到索引
  46. key: ix_name_psw
  47. key_len: 130
  48. ref: NULL
  49. rows: 2742817 # 没有命中索引的扫描行数。
  50. Extra: Using where; Using index
  51. 1 row in set (0.00 sec)

9.索引覆盖

当where里的条件与select查询条件相同时,就产生了索引覆盖。

  1. mysql> select id from user where id=2450000;
  2. +---------+
  3. | id |
  4. +---------+
  5. | 2450000 |
  6. +---------+
  7. 1 row in set (0.01 sec)

慢日志管理

根据公司业务场景,设置慢日志查询。比如我们写的SQL语句超过了阈值(自定义时间),那么我们通过这个日子可以查看到底是哪些SQL语句查询时超过了阈值,从而对其进行优化。

  1. 慢日志
  2. - 执行时间 > 10
  3. - 未命中索引
  4. - 日志文件路径
  5. 配置:
  6. - 内存
  7. show variables like '%slow%';
  8. show variables like '%long%';
  9. set global 变量名 =
  10. - 配置文件
  11. mysqld --defaults-file='E:\wupeiqi\mysql-5.7.16-winx64\mysql-5.7.16-winx64\my-default.ini'
  12. my.conf内容:
  13. slow_query_log = ON
  14. slow_query_log_file = D:/....
  15. 注意:修改配置文件之后,需要重启服务

慢查询日志:

查看慢SQL的相关变量

  1. mysql> show variables like '%slow%';
  2. +---------------------------+----------------------------------------+
  3. | Variable_name | Value |
  4. +---------------------------+----------------------------------------+
  5. | log_slow_admin_statements | OFF |
  6. | log_slow_slave_statements | OFF |
  7. | slow_launch_time | 2 |
  8. | slow_query_log | OFF # 默认关闭慢SQl查询日志,现在改成on |
  9. | slow_query_log_file | G:\MYSQL\data\WIN-KIJ962UBO3B-slow.log | # 慢SQL记录的位置
  10. +---------------------------+----------------------------------------+
  11. 5 rows in set (0.00 sec)

查看长SQL的相关变量

  1. mysql> show variables like '%long%';
  2. +--------------------------------------------------------+-----------+
  3. | Variable_name | Value |
  4. +--------------------------------------------------------+-----------+
  5. | long_query_time | 10.000000 |
  6. | performance_schema_events_stages_history_long_size | 10000 |
  7. | performance_schema_events_statements_history_long_size | 10000 |
  8. | performance_schema_events_waits_history_long_size | 10000 |
  9. +--------------------------------------------------------+-----------+
  10. 4 rows in set (0.00 sec)
  1. 配置慢SQL的变量:
  2. set global 变量名 =
  3. 1.设置慢查询开启模式
  4. set global slow_query_log = on;
  5. 2.设置慢查询记录文件位置(在文件路径的文件夹自动生成)
  6. set global slow_query_log_file="G:\MYSQL\data\WIN-KIJ962UBO3B-slow.log";
  7. 3.修改慢查询的阈值
  8. set global long_query_time=1;
  9. # 配置慢查询日志操作:
  10. mysql> set global slow_query_log = on;
  11. Query OK, 0 rows affected (0.00 sec)
  12. mysql>set global slow_query_log_file="G:\MYSQL\data\WIN-KIJ962UBO3B-slow.log";
  13. Query OK, 0 rows affected (0.04 sec)
  14. mysql>set global long_query_time=1;
  15. Query OK, 0 rows affected (0.00 sec)
  16. 查看慢日志设置是否成功: # 记得要重新启动客户端
  17. mysql> use db3;
  18. Database changed
  19. mysql> show variables like '%slow%';
  20. +---------------------------+-------------------------------------+
  21. | Variable_name | Value |
  22. +---------------------------+-------------------------------------+
  23. | log_slow_admin_statements | OFF |
  24. | log_slow_slave_statements | OFF |
  25. | slow_launch_time | 2 |
  26. | slow_query_log | ON |
  27. | slow_query_log_file | G:MYSQLdataWIN-KIJ962UBO3B-slow.log |
  28. +---------------------------+-------------------------------------+
  29. 5 rows in set (0.00 sec)
  30. mysql> show variables like '%long%';
  31. +--------------------------------------------------------+----------+
  32. | Variable_name | Value |
  33. +--------------------------------------------------------+----------+
  34. | long_query_time | 1.000000 |
  35. | performance_schema_events_stages_history_long_size | 10000 |
  36. | performance_schema_events_statements_history_long_size | 10000 |
  37. | performance_schema_events_waits_history_long_size | 10000 |
  38. +--------------------------------------------------------+----------+
  39. 4 rows in set (0.00 sec)
  40. 此时在"G:\MYSQL\data\";路径下会生成一个WIN-KIJ962UBO3B-slow.log文件,将sql语句查询超过1s的记录下来;
  1. mysql> select * from user where password=222;
  2. +---------+-----------+----------+
  3. | id | name | password |
  4. +---------+-----------+----------+
  5. | 5 | 小张 | 222 |
  6. | 1030412 | 小张222 | 222 |
  7. +---------+-----------+----------+
  8. 2 rows in set, 2 warnings (1.50 sec) # 超过阈值1s

查看"G:\MYSQL\data\WIN-KIJ962UBO3B-slow.log" 文件内是否保存超过1s的sql语句;

以后我们对超过阈值的sql语句进行优化,就可以打开该文件逐个分析优化了。

  1. MySQL日志管理
  2. ========================================================
  3. 错误日志: 记录 MySQL 服务器启动、关闭及运行错误等信息
  4. 二进制日志: 又称binlog日志,以二进制文件的方式记录数据库中除 SELECT 以外的操作
  5. 查询日志: 记录查询的信息
  6. 慢查询日志: 记录执行时间超过指定时间的操作
  7. 中继日志: 备库将主库的二进制日志复制到自己的中继日志中,从而在本地进行重放
  8. 通用日志: 审计哪个账号、在哪个时段、做了哪些事件
  9. 事务日志或称redo日志: 记录Innodb事务相关的如事务执行时间、检查点等
  10. ========================================================
  11. 一、bin-log
  12. 1. 启用
  13. # vim /etc/my.cnf
  14. [mysqld]
  15. log-bin[=dir\[filename]]
  16. # service mysqld restart
  17. 2. 暂停
  18. //仅当前会话
  19. SET SQL_LOG_BIN=0;
  20. SET SQL_LOG_BIN=1;
  21. 3. 查看
  22. 查看全部:
  23. # mysqlbinlog mysql.000002
  24. 按时间:
  25. # mysqlbinlog mysql.000002 --start-datetime="2012-12-05 10:02:56"
  26. # mysqlbinlog mysql.000002 --stop-datetime="2012-12-05 11:02:54"
  27. # mysqlbinlog mysql.000002 --start-datetime="2012-12-05 10:02:56" --stop-datetime="2012-12-05 11:02:54"
  28. 按字节数:
  29. # mysqlbinlog mysql.000002 --start-position=260
  30. # mysqlbinlog mysql.000002 --stop-position=260
  31. # mysqlbinlog mysql.000002 --start-position=260 --stop-position=930
  32. 4. 截断bin-log(产生新的bin-log文件)
  33. a. 重启mysql服务器
  34. b. # mysql -uroot -p123 -e 'flush logs'
  35. 5. 删除bin-log文件
  36. # mysql -uroot -p123 -e 'reset master'
  37. 二、查询日志
  38. 启用通用查询日志
  39. # vim /etc/my.cnf
  40. [mysqld]
  41. log[=dir\[filename]]
  42. # service mysqld restart
  43. 三、慢查询日志
  44. 启用慢查询日志
  45. # vim /etc/my.cnf
  46. [mysqld]
  47. log-slow-queries[=dir\[filename]]
  48. long_query_time=n
  49. # service mysqld restart
  50. MySQL 5.6:
  51. slow-query-log=1
  52. slow-query-log-file=slow.log
  53. long_query_time=3
  54. 查看慢查询日志
  55. 测试:BENCHMARK(count,expr)
  56. SELECT BENCHMARK(50000000,2*3);

查询优化注意事项:常见的SQL语句查询与优化

pymysql操作数据库、索引、慢日志管理的更多相关文章

  1. MySQL/MariaDB数据库的各种日志管理

    MySQL/MariaDB数据库的各种日志管理 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务日志 (transaction log) 1>.Innodb事务日志相 ...

  2. Python学习(二十九)—— pymysql操作数据库优化

    转载自:http://www.cnblogs.com/liwenzhou/articles/8283687.html 我们之前使用pymysql操作数据库的操作都是写死在视图函数中的,并且很多都是重复 ...

  3. MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05

    目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操 ...

  4. pymysql 操作数据库

    一.简介 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同,但目前pymysql支持python3.x而后者不支持3.x版本 其执行语句与sql源码相似 二.使用 ...

  5. SQLServer 2008以上误操作数据库恢复方法——日志尾部备份(转)

    问题: 经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了.人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题. 遇到这 ...

  6. [转]SQLServer 2008以上误操作数据库恢复方法——日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  7. SQL Server 2008以上误操作数据库恢复方法——日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  8. SQLServer 2008以上误操作数据库恢复方法—日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  9. Python使用PyMysql操作数据库

    安装 pip install -U pymysql 连接数据库 连接数据库有两种不同的格式 直接使用参数 代码如下 import pymysql.cursors connection = pymysq ...

随机推荐

  1. 【AMAD】splinter -- 用于测试web app的python框架

    简介 动机 作用 用法 热度分析 个人评分 简介 Splinter1是一个开源工具,使用Python编写,用于测试web apps.它可以用来对浏览器实现自动化操作,比如访问URLs,和按钮等交互. ...

  2. 1 初识数据库操作 2 JDBC 入门

    1 JDBC:Java Database Connectivity(Java 数据库连接) 1.1 JDBC 入门程序 注册驱动:Class.forName("com.mysql.cj.jd ...

  3. 【VS开发】MFC运行时库与debug、release版本之间的配置关系

    参考内容: 前段时间从网上下来一个有意思的代码,用VS2010打开时需要将工程转换为2010的工程,转化后却出现了编译不通过的问题,类似这样的错误:c:\program files\microsoft ...

  4. 【Linux开发】linux设备驱动归纳总结(六):1.中断的实现

    linux设备驱动归纳总结(六):1.中断的实现 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  5. 【linux杂谈】查看centOS系统的版本号和内核号

    因为种种原因,我们通常需要查看centOS系统的版本号和内核号. 这里以centOS 6为切入点,展示了几种查看版本号和内核号的方法,同时也验证了其在centOS 7上的可行性. 一.centOS 6 ...

  6. Python assert 关键字

    Python assert(断言)用于判断一个表达式,在表达式条件为 False 的时候触发异常. 断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况. 语法格式: ...

  7. asp.net之后台使用根目录运算符

    在asp.net前台,大家会经常使用根目录运算符~.这样,可以不用考虑网站的配置目录. 有时,需要在后台设置路径,同样需要使用根目录运算符.好吧,其实我每次需要使用这种方法,就需要在baidu上查找如 ...

  8. 内存溢出之PermGen space异常解决

    1.出现的异常: java.lang.OutOfMemoryError: PermGen space at sun.misc.Launcher$ExtClassLoader.getExtClassLo ...

  9. nigx下配置tp5.1路由

    打开宝塔面板,找到你要配置路由的网站并找到配置文件(如图1) (图1) 2.在配置文件里添加一下代码 set $root = /www/wwwroot/www.blogs.test/public; # ...

  10. HTML5自学2

    1.1   文字格式 一个杂乱无序.堆砌而成的网页,会让人感觉枯无味,而一个美观大方的网页,会让人有美轮美奂,流连忘返的感觉,本节将介绍如何设置网页文本格式. 文字格式包括字体.字号.文字颜色.字体风 ...