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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章