SQL/Redis必知必会笔记

没有最标准的,任何方式都有缺陷,没有最好的只有最合适的;就像Google 的SRE中有句经典的话“没有问题的程序是程序的特殊状态”

6. redis备忘录

  1. GETBIT key offset / SETBIT key offset value 操作字符串的位
    例如 set b b 设置一个key 为 b的值设置为 b,b在的二进制ascii码为 0110 0010 执行 setbit b 7 1 ,则key b的二进制变为 0110 0011 即变为c了
    在这里插入图片描述
  2. 避免中文乱码在redis-cli后面加上 --raw == redis-cli --raw ==
    在这里插入图片描述

5.触发器原理

触发器及其工作原理

4.redis,mysql python接口读写性能对比测试

  1. redis读写10000次:
import redis
import time
# 创建redis连接
pool = redis.ConnectionPool(host='localhost', port=6379)
r = redis.StrictRedis(connection_pool=pool)
# 记录当前时间
time1 = time.time()
# 1万次写
for i in range(10000):
    data = {'username': 'zhangfei', 'age':28}
    r.hmset("users"+str(i), data)
# 统计写时间
delta_time = time.time()-time1
print("[redis]write {0} times cost time = {1}".format(10000,delta_time))
# 统计当前时间
time1 = time.time()
# 1万次读
for i in range(10000):
    result = r.hmget("users"+str(i), ['username', 'age'])
# 统计读时间
delta_time = time.time()-time1
print("[redis]read {0} times cost time = {1}".format(10000,delta_time))

在这里插入图片描述
2. mysql读写10000次:

# -*- coding: UTF-8 -*-
import mysql.connector
import time
# 打开数据库连接
db = mysql.connector.connect(
       host="localhost",
       user="root",
       passwd="Abc12345", # 写上你的数据库密码
       database='test',
       auth_plugin='mysql_native_password'
)
# 获取操作游标
cursor = db.cursor()
# 执行SQL语句
cursor.execute("SELECT VERSION()")
# 获取一条数据
data = cursor.fetchone()
print("MySQL版本: %s " % data)

# cur.execute("CREATE TABLE IF NOT EXISTS heros (id int primary key, name text, hp_max real, mp_max real, role_main text)")
cursor.execute("drop table if exists heros")
cursor.execute("create table if not exists heros(id int primary key,username varchar(64),age int)")

begintime = time.time()
sqlstr="insert into heros(id,username,age) values"
for i in range(10000):
    sqlstr1=sqlstr+"({0},'zhangfei{1}',{2})".format(i+1,i+1,i+1)
    cursor.execute(sqlstr1)
db.commit()#不提交数据不会入库
costtime = time.time()-begintime
print("[mysql]write {0} times cost time = {1}".format(10000,costtime))

begintime1=time.time()
sqlstr="select username,age from heros where id = "
for i in range(10000):
    sqlstr2=sqlstr+str(i+1)
    cursor.execute(sqlstr2)
    data = cursor.fetchone()#不加这句循环几次就报错了
costtime2=time.time()-begintime1
print("[mysql]read {0} times cost time = {1}".format(10000,costtime2))
# 关闭游标&数据库连接
cursor.close()
db.close()

在这里插入图片描述
3.结论:redis略快,但差别并不是很大

3.redis安装教程

安装教程基本参考这里:
redis下载安装-官网
redis源码安装教程
遇到的问题
1.redis-server已开启 但redis-cli无任何反应
最后查找多方资料发现由于server被我ctrl + z 挂起,这才无法正常开启cli
解决方法一:开启server后,开辟另一个终端redis-cli即可
解决方法二:修改redis.conf文件将daemonize改成yes,使server以守护进程方式运行,记得重启server即可

2.初次是通过apt-get install的方式安装的,安装完之后通过redis-server命令启动,一直报下面的错误

3220:M 29 Jan 2020 23:52:20.307 # Could not create server TCP listening socket *:6379: bind: Address already in use

按照网上的方法(命令如下)杀死占用端口的进程,仍然无法解决.(每次杀死redis进程后都会被重新拉起来,其实这时redis-cli是能用的,所以应该是配置里配置redis进程的自动重启).最终通过apt-get autoremove redis* --pure 全部卸载redis后,重新通过源码安装解决了这个问题.

1.找到端口占用的进程

ps -ef|grep 6379

在这里插入图片描述
2.杀死进程

sudo kill -9 2016

在这里插入图片描述

2.linux通过sudo安装mysql普通用户无法登录的问题

linux下安装mysql后(安装教程),通过sudo mysql_secure_installation
设置了密码,却无法用普通用户进行登录.报错信息如下:
在这里插入图片描述
但是却可以直接通过sudo mysql命令登录数据库(密码都不用输),不知道为什么.

1.查看mysql运行状态
(状态正常)

yuanye@yuanye-PC:~$ sudo netstat -tap|grep mysql
tcp        0      0 localhost:mysql         0.0.0.0:*        LISTEN      8141/mysqld

2.运行如下命令,看到,root的密码确实为空。所以sudo mysql可不用密码进行登录.
在这里插入图片描述
3.看一下当前的授权插件是什么:
SELECT user, plugin FROM mysql.user;
在这里插入图片描述
4.修改密码和插件类型:
root采用的是授权插件是auth_socket,也即通过套接字进行鉴权。如果你安装的版本是5.7,并且没有为root用户提供密码(安装时并不需要),那么就会使用auth_socket插件,这个插件不关心也不需要密码,它只是通过UNIX套接字的用户名进行验证,如果验证通过,那么就鉴权成功。这就是root用户可以正常使用mysql的原因,因为root用户在mysql的user表中。
如果我们想配置密码,那么就需要同时改变插件并且设置密码。如果是先改变插件,然后设置密码就会不起作用。插件也会回滚到auth_socket.

update mysql.user set authentication_string=PASSWORD('Abc12345'),plugin='mysql_native_password' where user='root';

上面的语法中PASSWORD可能在后续版本中被弃用,所以也可使用如下语句:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

在这里插入图片描述
5.刷新权限
最后一定要记得刷新权限,然后即可通过 mysql -uroot -pxxx进行登录了

flush privileges;

在这里插入图片描述
参考:
Ubuntu安装MySQL成功后,普通用户无权访问:ERROR 1045 (28000): Access denied
Ubuntu18.04安装MySQL后普通用户无法登录
mysql完全卸载

1. sql中命令的执行顺序

1、FROM子句组装数据
2、WHERE子句进行条件筛选
3、GROUP BY分组
4、使用聚集函数进行计算;
5、HAVING筛选分组;
6、计算所有的表达式;
7、SELECT 的字段;
8、ORDER BY排序
9、LIMIT筛选

例子:

SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
FROM player JOIN team ON player.team_id = team.team_id #顺序1
WHERE height > 1.80 #顺序2
GROUP BY player.team_id #顺序3
HAVING num > 2 #顺序4
ORDER BY num DESC #顺序6
LIMIT 2 #顺序7

理解:肯定是先从哪张表中获取数据(from),拿到数据后进行过滤(where),分组(group by),计算/聚集(sum等),筛选(having),然后等都处理好后通过Select 返回,再对返回的结果进行排序(order by),最终还可以选择显示多少结果(limit)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值