Mysql索引,用户及授权(root密码恢复)
目錄
一.MySQL索引
1.MySQL索引的基本概念
1)優(yōu)缺點
2)分類
2.創(chuàng)建索引
1)普通索引index
3.查看索引
4.刪除索引
二.用戶及授權(quán)
1.授權(quán)
2.相關(guān)查詢指令
3.授權(quán)庫mysql
4.撤銷權(quán)限
5.root密碼恢復(fù)
一.MySQL索引
1.MySQL索引的基本概念
索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。我們可以簡單理解為:它是快速查找排好序的一種數(shù)據(jù)結(jié)構(gòu)。
可以用來快速查詢數(shù)據(jù)庫表中的特定記錄,所有的數(shù)據(jù)類型都可以被索引。
Mysql索引主要有兩種結(jié)構(gòu):B+Tree索引和Hash索引
1)優(yōu)缺點
優(yōu)點
?????? - 可以大大提高M(jìn)ySQL的檢索速度
?????? - 索引大大減小了服務(wù)器需要掃描的數(shù)據(jù)量
?????? - 索引可以幫助服務(wù)器避免排序和臨時表
?????? - 索引可以將隨機(jī)IO變成順序IO
缺點
?????? - 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進(jìn)行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存索引文件。
?????? - 建立索引會占用磁盤空間的索引文件。一般情況這個問題不太嚴(yán)重,但如果你在一個大表上創(chuàng)建了多種組合索引,索引文件的會膨脹很快。
?????? - 如果某個數(shù)據(jù)列包含許多重復(fù)的內(nèi)容,為它建立索引就沒有太大的實際效果。
?????? - 對于非常小的表,大部分情況下簡單的全表掃描更高效;
2)分類
普通索引
?????? - 不應(yīng)用任何限制條件的索引,該索引可以在任何數(shù)據(jù)類型中創(chuàng)建。
?????? - 字段本身的約束條件可以判斷其值是否為空或唯一。
?????? - 創(chuàng)建該類型索引后,用戶在查詢時,便可以通過索引進(jìn)行查詢。
唯一性索引
?????? - 使用UNIQUE參數(shù)可以設(shè)置唯一索引。
?????? - 創(chuàng)建該索引時,索引的值必須唯一,通過唯一索引,用戶可以快速定位某條記錄
?????? - 主鍵是一種特殊唯一索引。
全文索引
?????? - 使用FULLTEXT參數(shù)可以設(shè)置索引為全文索引。
?????? - 全文索引只能創(chuàng)建在CHAR、VARCHAR或者TEXT類型的字段上。查詢數(shù)據(jù)量較大的字符串類型的字段時,使用全文索引可以提高查詢速度。
?????? - 在默認(rèn)情況下,應(yīng)用全文搜索大小寫不敏感。如果索引的列使用二進(jìn)制排序后,可以執(zhí)行大小寫敏感的全文索引。
單列索引
?????? - 顧名思義,單列索引即只對應(yīng)一個字段的索引。
?????? - 應(yīng)用該索引的條件只需要保證該索引值對應(yīng)一個字段即可。
?????? - 可以包括普通、唯一、全文索引
多列索引
?????? - 多列索引是在表的多個字段上創(chuàng)建一個索引。
?????? - 該索引指向創(chuàng)建時對應(yīng)的多個字段,用戶可以通過這幾個字段進(jìn)行查詢。
?????? - 要想應(yīng)用該索引,用戶必須使用這些字段中的第一個字段。
2.創(chuàng)建索引
1)普通索引index
?????? - 一個表中可以有多個index
?????? - 字段的值可以重復(fù),且可以賦值為null
?????? - 通常在where條件中的字段上配置Index
?????? - index索引字段的標(biāo)志為mul
創(chuàng)建表時創(chuàng)建索引
CREATE TABLE 表名(字段列表,index(字段名),index(字段名), );在已有表中創(chuàng)建索引
CREATE INDEX 索引名 ON 表名(字段名);3.查看索引
DESC 表名; # 注意觀察Key這一列 或 SHOW INDEX FROM 表名 \G4.刪除索引
DROP INDEX 索引名 ON 庫.表名;二.用戶及授權(quán)
1.授權(quán)
1)創(chuàng)建用戶并授權(quán)
語法:
GRANT 權(quán)限列表 ON 庫名.表名 TO '用戶名'@'客戶端地址' IDENTIFIED BY '密碼' WITH GRANT OPTION;????????權(quán)限列表:用戶的操作權(quán)限,如SELECT,INSERT,UPDATE等,如果要授予所的權(quán)限則使用ALL
????????表名:表名,如果要授予該用戶對所有數(shù)據(jù)庫和表的相應(yīng)操作權(quán)限則可用*表示,如*.*
WITH GRANT OPTION:用戶擁有授權(quán)權(quán)限
示例:
# 授予zzg用戶在本地登陸的權(quán)限 mysql> grant select,update(phone_number,email) on nsd2021.employees to zzg@'localhost' identified by 'NSD2021@tedu.cn'; ? # 授予zzg用戶在任意地址登陸的權(quán)限 GRANT SELECT, INSERT, UPDATE(phone_number,email) ON nsd2021.employees to zzg@'%' IDENTIFIED BY 'NSD2021@tedu.cn';客戶端連接測試
# 安裝mysql/mariadb客戶端 [root@zzgrhel8 ~]# yum install -y mariadb ? [root@zzgrhel8 ~]# mysql -h服務(wù)器 -u用戶名 -p密碼2.相關(guān)查詢指令
1)查看用戶信息
SELECT USER();2)顯示登陸用戶自己的權(quán)限
SHOW GRANTS;3)管理員查看指定用戶的權(quán)限,用戶不存在則報錯
SHOW GRANTS FOR 用戶名@'客戶端地址';4)用戶修改自己的密碼
SET password=password('密碼');5)管理員修改指定用戶密碼
SET PASSWORD FOR 用戶名@'客戶端地址'=password('密碼');6)刪除用戶
DROP USER 用戶名@'客戶端地址';3.授權(quán)庫mysql
1)相關(guān)表
?????????????? user:記錄已有的授權(quán)用戶及權(quán)限。該表中主要關(guān)心host和user字段
??????????? ?? db:記錄已有授權(quán)用戶對數(shù)據(jù)庫的訪問權(quán)限。該表中主要關(guān)心host、db和user字段
????????tables_priv:記錄已有授權(quán)用戶對表的訪問權(quán)限
????????columns_priv:記錄已有授權(quán)用戶對字段的訪問權(quán)限
mysql> grant select,insert,update(phone_number,email) on nsd2021.employees to zzg@'localhost' identified by 'NSD2021@tedu.cn';?2)查看所有授權(quán)用戶
mysql> select user, host from mysql.user; +-----------+-----------+ | user | host | +-----------+-----------+ | root | % | | tom | % | | zzg | % | | mysql.sys | localhost | | root | localhost | | zzg | localhost | +-----------+-----------+ 6 rows in set (0.01 sec)?3)查詢zzg@'%'的權(quán)限
mysql> show grants for zzg@'%'; ? mysql> select host, user, db from mysql.db; +-----------+-----------+---------+ | host | user | db | +-----------+-----------+---------+ | % | tom | nsd2021 | | localhost | mysql.sys | sys | +-----------+-----------+---------+ 2 rows in set (0.00 sec) ? ? mysql> select * from tables_priv where User like '%zzg%'\G *************************** 1. row ***************************Host: localhostDb: nsd2021User: zzgTable_name: employeesGrantor: root@localhostTimestamp: 0000-00-00 00:00:00Table_priv: Select,Insert Column_priv: Update 1 row in set (0.00 sec)4.撤銷權(quán)限
語法
REVOKE 權(quán)限列表 ON 庫名.表名 FROM 用戶名@'客戶端地址';示例:
# 查看用戶有哪些權(quán)限 SELECT host, user FROM mysql.user; # 查看權(quán)限 SHOW GRANTS FOR 用戶名@'客戶端地址'; # 撤回授權(quán)權(quán)限 REVOKE GRANT OPTION ON *.* FROM 用戶名@'客戶端地址'; # 撤回用戶刪除權(quán)限 REVOKE DELETE ON *.* FROM 用戶名@'客戶端地址'; # 創(chuàng)建tom用戶,具有授權(quán)權(quán)限 mysql> grant all on *.* to tom@'%' identified by 'NSD2021@tedu.cn' with grant option; # tom登陸后,創(chuàng)建jerry用戶 [root@zzgrhel8 ~]# mysql -utom -pNSD2021@tedu.cn -h192.168.1.11 MySQL [(none)]> grant select on nsd2021.* to 'jerry'@'%' identified by 'NSD2021@tedu.cn';5.root密碼恢復(fù)
步驟
????????停止MySQL服務(wù)
????????跳過授權(quán)表啟動MySQL服務(wù)程序
????????修改root密碼
????????以正常方式重啟MySQL服務(wù)程序
示例:
# 停止MySQL服務(wù) [root@mysql1 ~]# systemctl stop mysqld # 修改配置文件,跳過授權(quán)表啟動MySQL服務(wù)程序 [root@mysql1 ~]# vim /etc/my.cnf [mysqld] skip-grant-tables ... ... ? # 啟動服務(wù) [root@mysql1 ~]# systemctl start mysqld # 修改root密碼 [root@mysql1 ~]# mysql mysql> update mysql.user set authentication_string=password('123456')-> where user='root' and host='localhost'; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 1 ? mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) # 以正常方式重啟MySQL服務(wù)程序 [root@mysql1 ~]# systemctl stop mysqld [root@mysql1 ~]# vim /etc/my.cnf [mysqld] # skip-grant-tables ... ... [root@mysql1 ~]# systemctl start mysqld [root@mysql1 ~]# mysql -uroot -p123456總結(jié)
以上是生活随笔為你收集整理的Mysql索引,用户及授权(root密码恢复)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql基础运用(视图,变量,存储,流
- 下一篇: MySQL主从同步(复制)