索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
更通俗的说,数据库索引好比是字典前面的目录,能加快数据库的查询速度
索引目的
索引的目的在于提高查询效率
索引原理
通过不断的缩小想要获得数据的范围来筛选出最终想要的结果
B树(根节点至少两个孩子)
-- 创建测试表test_index
create table test_index(title varchar(10));
-- 使用python程序(ipython也可以)通过pymsql模块 向表中加入十万条数据
-- 开启运行时间监测
set profiling=1;
-- 查找第1万条数据ha-99999
select * from test_index where title='ha-99999';
-- 查看执行的时间:(单位秒)
show profiles;
-- 为表title_index的title列创建索引
create index title_index on test_index(title(10));-- 长度 和建表语句长度一样 int类型可以不用写
-- 执行查询语句
select * from test_index where title='ha-99999';
-- 再次查看执行的时间
show profiles;
-- 查看索引
show index from 表名;
Table :表名Key_name :索引名Column_name :title字段有索引
-- 查看test_index表索引
show index from test_index;
-- 查看商品表索引
show index from goods;
-- 删除索引
drop index 索引名称 on 表名;
PRI:主键 MUL:外键(别的表主键)
主键、唯一键默认建立索引,因此通过主键、唯一键查询效率高,而通过普通字段查询,效率低
6. 注意:
要注意的是,建立太多的索引将会影响更新和插入的速度
7. 哪些情况需要创建索引 :数据量很大而且这个字段经常查
哪些情况需要创建索引
1、主键自动建立唯一索引
2、频繁作为查询条件的字段应该创建索引
3、查询中与其他表关联的字段,外键关系建立索引
4、频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
5、WHERE条件里用不到的字段不创建索引
6、查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
7、查询中统计或者分组字段
哪些情况不需要创建索引
1、表记录太少
2、经常增删改的表
3、如果某个数据列包含许多重复内容,为它建立索引就没有太大的实际效果
账户管理
1. 查看所有用户
-- 所有用户及权限信息存储在mysql数据库的user表中
-- 查看user表的结构
desc user;
user这一列:可以登录的MySQL用户(表示用户名)
host这一列:可以通过哪里登录(表示允许访问的主机)
1)当出现%,表示可以在任何地方登录
2)localhost,表示只能在本地登录,有密码也不好使
authentication_string表示密码,为加密后的值
-- 查看所有用户
select user, host,authentication_string from user;
不是明文密码,否则数据库被盗密码就知道了(密码要用加盐的方式加密,登录注册时也要用password(%s)进行加密)
需要使用实例级账户登录后操作,以root为例
常用权限主要包括:create、alter、drop、insert、update、delete、select
如果分配所有权限,可以使用all privileges
-- 创建账户&授权
grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';
grant:授权 on:哪一个数据库的哪一个表to:给谁 '用户名':新的用户名
'访问主机':如果是localhost,表示只能在本地登录,有密码也不好使;如果是%,表示可以在任何地方登录
创建前提:
step1:使用root登录
mysql -uroot -p
step2:创建账户并授予所有权限(在cw数据库执行)
-- localhost:表示只能在本地登录,有密码也不好使
grant select on cw.* to 'laoweng'@'localhost' identified by '2361559775';
-- %:表示可以在任何地方登录
grant select on cw.* to 'laoweng'@'%' identified by '2361559775';
-- 查看所有的数据库 (\q)
show databases;
-- 查看用户有哪些权限
show grants for laoweng@localhost;
step3:退出root的登录
\q
step4:使用laoweng账户登录
mysql -ulaoweng -p
就两个,除了自己的cw,还有一个是自带的,因为这个账户只有cw数据库的查询权限
-- 再次创建用户 (创建一个laoli的账号,密码为12345678,可以任意电脑进行链接访问, 并且对cw数据库中的所有表拥有所有权限)
grant all privileges on cw.* to "laoli"@"%" identified by "12345678";
laoli | %:表示只要跟我一个局域网就可以使用laoli这个账号登录我现在的数据库
账户管理 (二)账户操作
1. 修改权限
grant 权限名称 on 数据库 to 账户@主机with grant option;
-- 刷新权限
flush privileges;
2. 修改密码
使用root登录,修改mysql数据库的user表
使用password()函数进行密码加密(authentication_string表示密码)
update user set authentication_string=password('新密码') where user='用户名';
eg:修改mysql数据库user表里的laoweng这个账户的密码,将其改成123
update user set authentication_string=password('123') where user='laoweng';
注意修改完成后需要刷新权限刷新权限:
flush privileges
3. 远程登录(危险慎用)
为什么危险慎用?
只要允许远程登录,就可以扫描你的IP和端口,然后在网上下载字典,对你的root账户进行暴力登录,从而导致脱库
如果授权了(有%),还登不上,通过Linux系统sudo vim修改/etc/mysql/mysql.conf.d/mysqld.cnf 配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
然后重启msyql(Linux版)
sudo service mysql restart
重启mysql(windows版)
home键——>搜索服务——>找到MySQL57——>右键——>重新启动
重启之后,在另外的一台机器上进行连接测试
不用远程登录,可以用SSH
如果依然连不上,可能原因:
1) 网络不通
通过 ping xxx.xxx.xx.xxx可以发现网络是否正常
2)查看数据库是否配置了bind_address参数
本地登录数据库查看my.cnf文件和数据库当前参数show variables like 'bind_address';
如果设置了bind_address=127.0.0.1 那么只能本地登录
3)查看数据库是否设置了skip_networking参数
如果设置了该参数,那么只能本地登录mysql数据库
4)端口指定是否正确
4. 删除账户(推荐使用语法1,如果删不掉,再用语法2)
语法1:使用root登录
dropuser'用户名'@'主机';
eg:
dropuser'laoweng'@'%';
语法2:使用root登录,删除mysql数据库的user表中数据
delete from user where user='用户名';
eg:(删除mysql数据库user表中laoweng用户的数据)
delete from user where user='laoweng';
操作结束之后需要刷新权限
flush privileges
5. 忘记 root 账户密码怎么办 !!
一般也轮不到我们来管理 root 账户,所以别瞎操卖白粉的心了
万一呢? 到时候再来查http://blog.csdn.net/lxpbs8851/article/details/10895085