MySQL1索引

1、Mysql索引原理

  索引是帮助MySQL高效获取数据的数据结构,至关于书籍的目录。目前Mysql的MyISAM和InnoDB都支持B-Tree索引,InnoDB还支持B+Tree索引,Memory还支持Hash。如今互联网应用中对数据库的使用多数都是读较多,比例能够达到 10:1。而且数据库在作查询时 IO 消耗较大,因此若是能把一次查询的 IO 次数控制在常量级那对数据库的性能提高将是很是明显的,所以基于 B+ Tree 的索引结构出现了。mysql

  B+ Tree 的数据结构

  

  B+ Tree 的数据结构。是由一个一个的磁盘块组成的树形结构,每一个磁盘块由数据项和指针组成。git

  全部的数据都是存放在叶子节点,非叶子节点不存放数据。github

查找过程

  以磁盘块1为例,指针 P1 表示小于17的磁盘块,P2 表示在 17~35 之间的磁盘块,P3 则表示大于35的磁盘块。sql

好比要查找数据项99,首先将磁盘块1 load 到内存中,发生 1 次 IO。接着经过二分查找发现 99 大于 35,因此找到了 P3 指针。经过P3 指针发生第二次 IO 将磁盘块4加载到内存。再经过二分查找发现大于87,经过 P3 指针发生了第三次 IO 将磁盘块11 加载到内存。最后再经过一次二分查找找到了数据项99。数据库

  因而可知,若是一个几百万的数据查询只须要进行三次 IO 便可找到数据,那么整个效率将是很是高的。数据结构

观察树的结构,发现查询须要经历几回 IO 是由树的高度来决定的,而树的高度又由磁盘块,数据项的大小决定的。工具

磁盘块越大,数据项越小那么树的高度就越低。这也就是为何索引字段要尽量小的缘由。性能

2、索引优化

负向查询不能使用索引

select name from user where id not in (1,3,4);

应该修改成:优化

select name from user where id in (2,5,6);

前导模糊查询不能使用索引

如:ui

select name from user where name like '%zhangsan'

非前导则能够:

select name from user where name like 'zhangsan%'

建议能够考虑使用 Lucene 等全文索引工具来代替频繁的模糊查询。

数据区分不明显的不建议建立索引

如 user 表中的性别字段,能够明显区分的才建议建立索引,如身份证等字段。

字段的默认值不要为 null

这样会带来和预期不一致的查询结果。

在字段上进行计算不能命中索引

select name from user where FROM_UNIXTIME(create_time) < CURDATE();

应该修改成:

select name from user where create_time < FROM_UNIXTIME(CURDATE());

最左前缀问题

若是给 user 表中的 username pwd 字段建立了复合索引那么使用如下SQL 都是能够命中索引:

select username from user where username='zhangsan' and pwd ='axsedf1sd' select username from user where pwd ='axsedf1sd' and username='zhangsan' select username from user where username='zhangsan'

可是使用

select username from user where pwd ='axsedf1sd'

是不能命中索引的。

若是明确知道只有一条记录返回

select name from user where username='zhangsan' limit 1

能够提升效率,可让数据库中止游标移动。

不要让数据库帮咱们作强制类型转换

select name from user where telno=18722222222

这样虽然能够查出数据,可是会致使全表扫描。

须要修改成

select name from user where telno='18722222222'

若是须要进行 join 的字段两表的字段类型要相同

否则也不会命中索引。

3、Mysql安装

3.1 用最简单的方式装一个mysql数据库

yum install -y mysql-server

chkconfig mysqld on
 
service mysqld start

mysql -u root

set password for root@localhost=password('root');

mysql -uroot -proot

3.2 mysql 链接问题报1045错误

  1.进入mysql数据库:

mysql> use mysql;Database changed

  2.给root用户设置新密码,蓝色部分本身输入:

mysql> update user set password=password("123456") where user="root";
Query OK, 1 rows affected (0.04 sec)Rows matched: 1 Changed: 1 Warnings: 0

  3.刷新数据库

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

  4.退出mysql

mysql> quit 
  Bye
相关文章
相关标签/搜索