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;
==高性能索引策略==
- 在WHERE中独立使用列,尽量避免其参与运算,如: WHERE age > 30
- 左前缀索引:索引构建于字段的最左侧的多少个字符,要通过索引选择性来评估
- 多列索引:使用 AND 连接的多个查询条件情况更适合使用多列索引,而非多个单键索引,如:
CREATE INDEX gender_age ON students(Gender,Age);
SELECT * FROM students WHERE Gender='M' AND Age>=19;
-
==选择合适的索引列次序:选择性最高的放左侧==
- 对于下面的查询语句,建立合适的索引导致查询性能差异很大,可建立的索引为
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 来查看查询语句的执行过程和效率。