MySQL 基礎與高性能索引策略

MySQL 基礎與高性能索引策略

MySQL基礎知識點

用戶管理

#查看已有用戶信息
SELECT User,Host,Password FROM mysql.user;
#創建新用戶並查看信息
CREATE USER 'tom'@'172.16.0.%' IDENTIFIED BY 'tom';
SELECT User,Host,Password FROM mysql.user;
#重命名用戶
RENAME USER 'tom'@'172.16.0.%' TO 'obama'@'172.16.0.%';
  • 修改密碼的三種方法
#方法1
SET PASSWORD FOR 'jerry'@'172.16.50.%' = PASSWORD('jerry');
#方法2
UPDATE user SET Password=PASSWORD('') WHERE Host='localhost';
#方法3
mysqladmin -ujerry -h'172.16.50.9' -p password 'jerry';
  • 假如管理員密碼忘記了,可使用如下辦法
#修改配置文件,登錄時跳過身份驗證
vim /usr/lib/systemd/system/mariadb.service 
ExecStart=/usr/bin/mysqld_safe --basedir=/usr --skip-grant-tables --skip-networking
#重讀配置,重啓服務
systemctl daemon-reload
systemctl restart mariadb
#進入mysql、修改密碼,然後退出mysql,將修改的配置文件恢復原樣
vim /usr/lib/systemd/system/mariadb.service 
ExecStart=/usr/bin/mysqld_safe --basedir=/usr 
#重讀配置,重啓服務
systemctl daemon-reload
systemctl restart mariadb
#使用已知的密碼登錄mysql
  • ==執行用戶或權限管理類語句後,一定要刷新授權信息==
FLUSH PRIVILEGES;

權限管理

  • 授權:GRANT
GRANT  priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user_specification [, user_specification] ... [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] [WITH with_option ...]

object_type:
TABLE
| FUNCTION
| PROCEDURE

priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name


ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'             

with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
  • 查看授權:SHOW GRANTS
SHOW GRANTS [FOR 'user'@'host']
  • 取消授權:REVOKE
REVOKE  priv_type [(column_list)][, priv_type [(column_list)]] ... ON [object_type] priv_level FROM  'user'@'host' [,  'user'@'host'] ...
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

INDEX —— MySQL 的索引

索引

索引的優點:可以降低需要掃描的數據量,減少了IO次數;可以幫助避免排序操作,避免使用臨時表;幫助將隨機IO轉爲順序IO。

注意:==創建索引後會降低寫性能==,表數據量越大,降低性能越多。

  • 索引類型:B+ TREE,HASH
    B+ TREE:順序存儲,每一個葉子結點到根結點的距離相同;左前綴索引,適合於範圍類型的數據查詢;

  • 適用於B+ TREE索引的查詢類型:全鍵值、鍵值範圍或鍵前綴;

全值匹配:精確匹配某個值;

    WHERE CLOUMN = 'value';

匹配最左前綴:只精確起頭的部分;

    WEHRE COLUMN LIKE 'PREFIX%';                        

匹配範圍值:

精確匹配某一列,範圍匹配另一列;

只用訪問索引的查詢:覆蓋索引;

    index(Name)

    SELECT Name FROM students WHERE Name LIKE 'L%';
  • 不適用B+ TREE索引:
如查條件不是從最左側列開始,索引無效;
    index(age,name), WHERE name='Jerry';    , WHERE age>30;
不能跳過索引中的某列;
    index(name,age,gender)
    WHERE second_name='black' and age > 30;
如果查詢中的某個列是爲範圍查詢,那麼其右側的列都無法再使用索引優化查詢;
  • Hash索引:基於哈希表實現,特別適用於值的精確匹配查詢;

  • 適用場景:

只支持等值比較查詢,例如=, IN(), <=>

  • 不用場景:

所有非精確值查詢;MySQL僅對memory存儲引擎支持顯式的hash索引;

索引使用方法

  • 創建索引
#創建單字段索引
CREATE INDEX index_name ON table_name(column_name);

#創建多字段組合索引
CREATE INDEX index_name ON table_name(column_name1,column_name2);
  • 查詢某表上的索引
SHOW INDEXES FROM  table_name;
  • 刪除索引
DROP INDEX index_name ON table_name;

==高性能索引策略==

  1. 在WHERE中獨立使用列,儘量避免其參與運算,如: WHERE age > 30
  2. 左前綴索引:索引構建於字段的最左側的多少個字符,要通過索引選擇性來評估
  3. 多列索引:使用 AND 連接的多個查詢條件情況更適合使用多列索引,而非多個單鍵索引,如:
CREATE INDEX gender_age ON students(Gender,Age);
SELECT * FROM students WHERE Gender='M' AND Age>=19;
  1. ==選擇合適的索引列次序:選擇性最高的放左側==

    • 對於下面的查詢語句,建立合適的索引導致查詢性能差異很大,可建立的索引爲

CREATE INDEX gender_age ON students(Gender,Age);

CREATE INDEX age_gender ON students(Age,Gender); ==> 性能優先

  • 建立組合索引的原則:按照精確性高的放左側、精確性低的放右側的順序建立索引
#因爲gender字段爲精確查詢,不涉及範圍查詢,所以精確性高,而age字段涉及到範圍查詢,精確性低,所以:
CREATE INDEX age_gender ON students(Age,Gender);
SELECT * FROM students WHERE Gender='M' AND Age>=19;
  • 可以在 SELECT 語句前面加上 EXPLAIN 來查看查詢語句的執行過程和效率。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章