在智联招聘网站做销售,抖音代运营合同模板免费下载,大连成品网站建设,邯郸专业做网站多少钱一、存储引擎 
1、MYSQL体系结构 
连接层、服务层、引擎层、存储层#xff1b; 2、存储引擎简介 
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的#xff0c;而不是库的#xff0c;所以存储引擎也可被称为表类型。 
1#xff09;在创… 
一、存储引擎 
1、MYSQL体系结构 
连接层、服务层、引擎层、存储层 2、存储引擎简介 
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的而不是库的所以存储引擎也可被称为表类型。 
1在创建表时指定存储引擎 
CREATE TABLE 表名(字段1名 字段1类型 [COMMENT 字段1注释],……字段n名 字段n类型 [COMMENT 字段n注释]
)ENGINEINNODB [COMMENT 表注释] 
2查看数据库引擎 
--查看数据库的引擎mysql show engines;
-----------------------------------------------------------------------------------------------------------------------------
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
-----------------------------------------------------------------------------------------------------------------------------
| ndbcluster         | NO      | Clustered, fault-tolerant tables                               | NULL         | NULL | NULL       |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| ndbinfo            | NO      | MySQL Cluster system information storage engine                | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
-----------------------------------------------------------------------------------------------------------------------------
11 rows in set (0.04 sec)--查看数据库中某个表使用的什么存储引擎show create table xxx; 
3、存储引擎特点 
一INNODB 1)介绍 
InnoDB是一种兼顾高可靠性和高性能的通用存储引擎在Mysql 5.5之后InnoDB是mysql默认的存储引擎 2)特点 
DML操作遵循ACID模型支持事务 
行级锁支持并发访问性能 
支持外键FOREIGN KEY约束保证数据完整性和正确性 3)文件 
xxx.ibd  :xxx是文件名InnoDB引擎的每张表都对应这样一个表空间文件存储该表的表结构frm、sdi、数据和索引 
参数innodb_file_per_table 使用命令可查看idb文件中的文件结构 ibd2sdi xxx.ibd 
-- 查看变量每个表一个文件8.0版本之后默认是ON
mysql show variables like innodb_file_per_table;
------------------------------
| Variable_name         | Value |
------------------------------
| innodb_file_per_table | ON    |
------------------------------
1 row in set (0.01 sec)4)逻辑存储结构 
表空间TableSpace 
段Segment 
区Extent     默认大小  1M   包含64个页 
页Page      默认大小   16K 
行Row 二MyISAM 1介绍 
MyISAM是MYSQL早期默认存储引擎。 2特点 
不支持事务不支持外键 
支持表锁不支持行锁 
访问速度快 3)  文件 
xxx.sdi存储表结构信息 
xxx.MYD存储数据 
xxx.MYI存储索引 三Memory 1介绍 
Memory存储引擎的表数据是存储在内存中的受到断电问题、或硬件问题的影响只能将这些表作为临时表或者缓存使用。 2特点 
内存存放 
Hash索引默认 3文件 
xxx.sdi存放表结构信息 
4、存储引擎选择 
根据应用系统特点选择存储引擎对于复杂应用可以根据实际情况选择多种存储引擎的组合。 
InnoDBmysql默认存储引擎支持事务和外键。如果应用对事务的完整性有较高要求在并发条件下要求数据一致性数据操作除了插入和查询之外还有很多更新和删除操作那么innoDB存储引擎是比较合适的选择。 
MyISAM如果数据以插入和查询为主对数据的更新和删除较少并且对事务的完整性和并发性要求不高选择这个存储引擎比较合适。 
Memory:将所有数据保存到内存中访问速度快通常用于临时表及缓存。memory对表的大小有限制太大的表无法缓存到内存中而且无法保证数据的安全性。 
二、索引 
1、索引概述 
介绍 
索引是帮助mysql高效获取数据的一种数据结构有序的。在数据之外数据库还维护着满足特定查找算法的数据结构这些数据结构以某种方式引用指向数据这样就可以在这些数据结构上实现高级查找算法这种数据结构就是索引。 
优缺点 
优势劣势提高数据检索效率降低数据库的IO成本索引也是要暂用存储空间的通过索引列对数据进行排序降低数据排序的成本降低CPU的消耗索引大大提高了查询效率同时降低了更新表的速度如对表进行INSERT、UPDATE、DELETE时效率降低。 
2、索引结构 
索引结构描述BTree索引最常见的索引类型大部分存储引擎都支持B树索引Hash索引底层数据结构使用hash表实现的只有精确匹配索引列的查询才有效不支持范围查询R-Tree空间索引空间索引是MyISAM引擎的一种特殊索引类型主要用于地理空间数据类型用的较少Full-text全文索引是一种通过建立倒排索引快速匹配文档的方式。类似于Lucene、Solr、ES 
索引支持情况 
索引InnoDBMyISAMMemoryBTree索引你支持支持支持Hash索引不支持不支持支持R-Tree索引不支持支持不支持Full-text全文索引5.6版本之后支持支持不支持 
我们平时说的索引结构如果不做特殊说明都是指BTree索引。 
1二叉树 
左小右大的二叉树 缺点 
1顺序插入时会形成一个链表查询性能大大降低。 
2大数据量情况下层级较深检索速度慢。 
2红黑树 
使用红黑树解决二叉树的平衡问题第一个问题但是问题二依然存在 
大数据量情况下层级较深检索速度慢。 
3B树多路平衡查找树 
以一颗最大度数max-degree为55阶的B-Tree为例每个节点最多存储4个key5个指针 
树的度数指的是一个节点的最大子节点个数。 4B树 
相对于B-Tree特点 
1所有数据都出现在叶子节点非叶子节点只起到索引作用 
2叶子节点是个单向链表 
以一个最大度数为44阶的B树为例 Mysql索引数据结构对经典的BTree进行了优化在原BTree的基础上增加了一个指向相邻叶子节点的链表指针就形成了一个带有顺序指针的BTree提高了区间访问的性能。 5Hash 
哈希索引就是采用一定的hash算法将键值换算成新的hash值映射到对应的槽位上然后存储在哈希表中。 
如果两个或者多个键值映射到一个相同的槽位上他们就产生了哈希冲突也成为哈希碰撞可以通过链表来解决。 hash索引特点 
1只能用于对等比较in不支持范围查询 
2无法利用索引完成排序操作 
3查询效率高通常只需要一次检索就可以了效率通常要高于BTree索引 
存储引擎支持 
在mysql中支持hash索引的是memory引擎而InnoDB中具有自适应hash功能hash索引是存储引擎根据BTree索引在指定条件下自动构建的。 
6为什么InnoDB采用BTree索引结构 
1相对于二叉树层级更少搜索效率更高。 
2对于B-树无论是叶子结点还是非叶子节点都会保存数据这样导致一页存储的键值减少指针跟着减少要同样保存大量数据只能增加数的高度导致性能下降。 
3对于Hash索引BTree支持范围查找及排序操作。 
3、索引分类 
分类含义特点关键字主键索引针对于表中主键创建的索引默认自动创建只能有一个primary唯一索引避免表中某个列的值数据重复可以有多个unique普通索引快速定位特定数据可以有多个全文索引全文索引查找的是文本中的关键词而不是比较索引中的值可以有多个fulltext 
在InnoDB存储引擎中根据索引的存储形式又可以分为以下两种 
分类含义特点聚集索引Clustered Index将数据存储于索引结构放到一块索引结构的叶子节点保存了行数据必须有而且只有一个二级索引Secondary Index将数据与索引分开存储索引结构的叶子节点关联的是对应的主键可以存在多个 
聚集索引选取规则 
1如果存在主键主键索引就是聚集索引 
2如果没有主键将使用第一个唯一索引UNIQUE作为聚集索引 
3如果表没有主键或没有合适的唯一索引则InnoDB会自动生成一个rowid作为隐藏的聚集索引 思考 
InnoDB主键索引的BTree高度为多高 假设 
一行数据大小为1k一页中可以存储16行这样的数据InnoDB的指针暂用6个字节的空间主键即使是BigInt暂用字节数为8 
高度为2 
n*8n1*6 16*1024      算出n约为1170 
1171*1618736 
高度为3: 
1171*1171*1621939856 ≈ 2200万 
4、索引语法 
--创建索引
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_col_name……);
--查看索引
SHOW INDEX FROM table_name;
--删除索引
DROP INDEX index_name ON table_name5、sql性能分析 
一SQL执行频率 
Msql客户端连接成功后通过命令show 【session|global】status 可以提供服务器状态信息通过如下指令可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT访问频次。如果没有select查询或者很少的查询操作就没必要做优化。 
show global status like Com_______              7个下划线 
--查看各种语句使用频率
mysql show global status like Com_______- ;
----------------------
| Variable_name | Value |
----------------------
| Com_binlog    | 0     |
| Com_commit    | 4     |
| Com_delete    | 0     |
| Com_import    | 0     |
| Com_insert    | 8     |
| Com_repair    | 0     |
| Com_revoke    | 2     |
| Com_select    | 263   |
| Com_signal    | 0     |
| Com_update    | 10    |
| Com_xa_end    | 0     |
----------------------
11 rows in set (0.01 sec) 
二慢查询日志 
1查看慢查询日志是否开启 
show ariables like ‘slow_query_log’ 
--查看慢查询日志开关是否开启默认是关闭
mysql show variables like slow_query_log;
-----------------------
| Variable_name  | Value |
-----------------------
| slow_query_log | OFF   |
-----------------------
1 row in set (0.02 sec) 
慢查询日志记录了所有执行时间超过指定参数long_query_time单位秒默认10秒的所有sql语句日志。 
2开启慢查询 
mysql的慢查询日志默认没有开启需要在MYSQL配置文件/etc/my.cnf中配置如下信息: 
--开启mysql慢查询日志开关
slow_query_log1
--设置慢日志的时间为2秒sql语句执行时间超过两秒就会视为慢查询记录慢查询日志
long_query_time2 
3查看慢查询 
配置完毕后通过以下指令重启mysql服务器进行测试查看慢日志记录文件中记录的信息/var/lib/mysql/localhost-slow.log 三profile详情 
show profiles命令在做sql优化时能够帮我们了解每一条sql时间都耗费到哪里去了。通过have_profiling参数能够看到当前mysql是否支持profile操作 
1是否支持profile操作 
select have_profiling; 
默认profiling是关闭的 
2) 查看profiling是否开启 
select profiling; 
3开启profile 
可以在session|global级别开启profiling 
set profiling1; 
--当前mysql是否支持profile操作
mysql select have_profiling;
------------------
| have_profiling |
------------------
| YES              |
------------------
1 row in set, 1 warning (0.00 sec)--查看profiling开关是否开启默认是关闭状态。 1表示开启0表示关闭。
mysql select profiling;
-------------
| profiling |
-------------
|           0 |
-------------
1 row in set, 1 warning (0.00 sec)mysql show profiles;
Empty set, 1 warning (0.00 sec)--打开profile详情mysql set profiling1;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql select profiling;
-------------
| profiling |
-------------
|           1 |
-------------
1 row in set, 1 warning (0.01 sec)4查看每一条sql语句耗时情况 
开启profiling开关之后通过如下指令查看指令的执行耗时。 
show profiles; 
5查看每个极端耗时情况 
--查看指定query_id的查询语句每个阶段的耗时情况 
show profile query for query_id; 
6查看每个阶段CPU使用情况 
--查看指定query_id的sql语句cpu使用情况 
show profile cpu query for query_id; 
7下面是使用示例 
--查看每一条sql耗时基本情况
show profiles;
--查看指定query_id的查询语句每个阶段的耗时情况
show profile query for query_id;--查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;--执行一些sql语句供后面查询用
mysql select * from account;
-------------------
| id | name   | money |
-------------------
|  1 | 张三   |  2000 |
|  2 | 李四   |  2000 |
-------------------
2 rows in set (0.00 sec)mysql select * from t01;
Empty set (0.00 sec)mysql select * from user;
----------------------
| id | name   | password |
----------------------
|  1 | 张三   | 123      |
|  2 | 李四   | 123      |
|  3 | 王五   | 123      |
|  4 | 王五   | 123      |
|  5 | NULL   | 123456   |
|  6 | doumi  | 123456   |
----------------------
6 rows in set (0.00 sec)mysql select * from user where id3- ;
----------------------
| id | name   | password |
----------------------
|  3 | 王五   | 123      |
----------------------
1 row in set (0.00 sec)mysql select * from user where namedoumi;
---------------------
| id | name  | password |
---------------------
|  6 | doumi | 123456   |
---------------------
1 row in set (0.00 sec)
--查看每一条SQL的耗时情况 查看每条sql语句执行耗时情况 
show profiles; mysql show profiles;
-------------------------------------------------------------
| Query_ID | Duration   | Query                                 |
-------------------------------------------------------------
|        1 | 0.01071200 | show tables                           |
|        2 | 0.00215000 | select * from account                 |
|        3 | 0.00290200 | select * from t01                     |
|        4 | 0.00397000 | select * from user                    |
|        5 | 0.00320600 | select * from user where id3         |
|        6 | 0.00151600 | select * from user where namedoumi |
-------------------------------------------------------------
6 rows in set, 1 warning (0.00 sec) 
show profile for query 6;    -- 6是上面show profiles命令结果中的query_id 
--查看query_id 为6的那条sql语句每个阶段的耗时情况
mysql show profile for query 6;
------------------------------------------
| Status                         | Duration |
------------------------------------------
| starting                       | 0.000087 |
| Executing hook on transaction  | 0.000009 |
| starting                       | 0.000008 |
| checking permissions           | 0.000007 |
| Opening tables                 | 0.000045 |
| init                           | 0.000008 |
| System lock                    | 0.000009 |
| optimizing                     | 0.000943 |
| statistics                     | 0.000060 |
| preparing                      | 0.000111 |
| executing                      | 0.000102 |
| end                            | 0.000007 |
| query end                      | 0.000005 |
| waiting for handler commit     | 0.000012 |
| closing tables                 | 0.000011 |
| freeing items                  | 0.000034 |
| cleaning up                    | 0.000058 |
------------------------------------------
17 rows in set, 1 warning (0.01 sec) 
show profile cpu for query 6;    -- 6是上面show profiles命令结果中的query_id 
--查看query_id为6的那条sql语句CPU消耗情况
mysql show profile cpu for query 6;
----------------------------------------------------------------
| Status                         | Duration | CPU_user | CPU_system |
----------------------------------------------------------------
| starting                       | 0.000087 | 0.000073 |   0.000013 |
| Executing hook on transaction  | 0.000009 | 0.000003 |   0.000007 |
| starting                       | 0.000008 | 0.000006 |   0.000002 |
| checking permissions           | 0.000007 | 0.000004 |   0.000003 |
| Opening tables                 | 0.000045 | 0.000043 |   0.000002 |
| init                           | 0.000008 | 0.000003 |   0.000005 |
| System lock                    | 0.000009 | 0.000007 |   0.000002 |
| optimizing                     | 0.000943 | 0.000023 |   0.000175 |
| statistics                     | 0.000060 | 0.000043 |   0.000016 |
| preparing                      | 0.000111 | 0.000043 |   0.000068 |
| executing                      | 0.000102 | 0.000096 |   0.000006 |
| end                            | 0.000007 | 0.000003 |   0.000004 |
| query end                      | 0.000005 | 0.000003 |   0.000003 |
| waiting for handler commit     | 0.000012 | 0.000010 |   0.000002 |
| closing tables                 | 0.000011 | 0.000009 |   0.000002 |
| freeing items                  | 0.000034 | 0.000010 |   0.000024 |
| cleaning up                    | 0.000058 | 0.000022 |   0.000035 |
----------------------------------------------------------------
17 rows in set, 1 warning (0.01 sec)四explain执行计划 
EXPLAIN或者DESC命令获取mysql如何执行select语句的信息包括在select执行过程中表如何连接及连接的顺序。 
语法 
直接在select 语句前面加上explain/desc EXPLAIN SELECT 字段名 FROM 表名 WHERE 条件 DESC SELECT 字段名 FROM 表名 WHERE 条件 mysql explain select * from user where id2;
----------------------------------------------------------------------------------------------------------
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
----------------------------------------------------------------------------------------------------------
|  1 | SIMPLE      | user  | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
----------------------------------------------------------------------------------------------------------
1 row in set, 1 warning (0.01 sec)mysql desc select * from user where id2;
----------------------------------------------------------------------------------------------------------
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
----------------------------------------------------------------------------------------------------------
|  1 | SIMPLE      | user  | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
----------------------------------------------------------------------------------------------------------
1 row in set, 1 warning (0.00 sec) 执行计划中每个字段含义 
idselect查询的序列号表示查询中执行select子句或者操作表的顺序id相同执行顺序从上到下id不同值越大越先执行 
select_type表示查询类型常见的有SIMPLE简单表即不使用表连接或子查询、PRIMARY主查询即外层的查询、UNIONUNION中的第二个或者后面的语句、SUBQUERYselect或者where之后包含了子查询 
type表示连接类型性能由好到差的连接类型是NULLsystem、const、eq_ref、ref、range、index、all 
possible_keys显示可能应用在这张表的上索引一个或多个。 
key实际用到的索引如果没用到展示位null 
key_lens表示索引中使用的字节数该值为索引字段最大可能长度并非实际使用长度在不损失精确性的前提下长度越短越好。 
rowsmysql认为必须要执行查询的行数在InnoDB引擎的表中是一个估计值可能并不总是准确的。 
filtered:表示返回结果的行数占需读取行数的百分比filtered的值越大越好。 
mysql select s.*,c.* from student_course sc,student s,course c where sc.student_id s.id and sc.course_id  c.id;
---------------------------------------
| id | name      | no         | id | name   |
---------------------------------------
|  1 | 红小豆    | 2000100101 |  1 | JAVA   |
|  1 | 红小豆    | 2000100101 |  2 | PHP    |
|  1 | 红小豆    | 2000100101 |  3 | MYSQL  |
|  2 | 张天爱    | 2000100102 |  3 | MYSQL  |
|  2 | 张天爱    | 2000100102 |  3 | MYSQL  |
|  3 | 鹿晗      | 2000100103 |  4 | HADOOP |
---------------------------------------
6 rows in set (0.00 sec)mysql 
mysql 
mysql desc select s.*,c.* from student_course sc,student s,course c where sc.student_id s.id and sc.course_id  c.id;;
----------------------------------------------------------------------------------------------------------------------------------------------------------------
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref                   | rows | filtered | Extra                                      |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|  1 | SIMPLE      | s     | NULL       | ALL    | PRIMARY       | NULL    | NULL    | NULL                  |    4 |   100.00 | NULL                                       |
|  1 | SIMPLE      | sc    | NULL       | ALL    | NULL          | NULL    | NULL    | NULL                  |    6 |    16.67 | Using where; Using join buffer (hash join) |
|  1 | SIMPLE      | c     | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | lyltest1.sc.course_id |    1 |   100.00 | NULL                                       |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
3 rows in set, 1 warning (0.00 sec)mysql explain- select s.* from student s where - s.id in(select sc.student_id from student_course sc where sc.course_id- (select c.id from course c where c.nameMYSQL));
---------------------------------------------------------------------------------------------------------------------------------------------------------
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                                     |
---------------------------------------------------------------------------------------------------------------------------------------------------------
|  1 | PRIMARY     | s     | NULL       | ALL  | PRIMARY       | NULL | NULL    | NULL |    4 |   100.00 | NULL                                                      |
|  1 | PRIMARY     | sc    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    6 |    16.67 | Using where; FirstMatch(s); Using join buffer (hash join) |
|  3 | SUBQUERY    | c     | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where                                               |
---------------------------------------------------------------------------------------------------------------------------------------------------------
3 rows in set, 1 warning (0.01 sec) 
需要重点关注的字段 6、索引使用 
使用原则 
最左前缀法则 
如果索引了多列联合索引要遵守最左前缀法则。最左前缀法则指的是查询从最左列开始并且不跳过索引中的列。 
如果跳过某个列索引将部分失效后面的字段索引失效 
下图说明跟查询条件的位置没关系只要查询中包含了索引字段就行包含了三个字段则使用三个列的索引 索引失效的情况 
1范围查询 
联合索引中出现范围查询,范围查询右侧的列索引失效。使用,替代, ,使所有索引字段都生效。 explain select * from tb_user where profession‘软件工程’ and age30 and status0; --索引idx_user_pro_age_sta只能使用profession explain select * from tb_user where profession‘软件工程’ and age30 and status0; --索引idx_user_pro_age_sta 所有索引字段都生效 2索引列运算 
不要在索引列上进行运算操作索引将失效。 3字符串不加引号 4模糊查询 
如果仅仅是尾部进行模糊匹配索引不会失效如果是头部模糊匹配索引失效。 
应尽量避免模糊查询开头加%的情况。 5or连接的条件 
用or分割开的条件如果or前的条件中的列有索引or后面的条件中的列没索引那么涉及的索引都不会被引用到。 
需要使or中的所有条件都有索引查询才能走索引。 6数据分布影响 
如果mysql评估使用索引比全表扫描更慢则不使用索引。 
数据的分布可能会影响使用索引还是不使用。例如某个字段如果大部分都是null 则条件is null 就不走索引is not null就会总索引 
使用规则-SQL提示 
sql提示是优化数据库的一个重要手段简单来说就是在sql语句中加入一些认为的提示来达到优化操作的目的。 
use index explain select * from tb_user use index(idx_user_pro) where profession软件工程; ignore index explain select * from tb_user use ignore index(idx_user_pro) where profession软件工程; force index explain select * from tb_user use force index(idx_user_pro) where profession软件工程; 使用规则-覆盖索引 
尽量使用覆盖索引查询使用了索引并且需要返回的列在该索引中已经全部能够找到减少select *。 知识小贴士 using index condition查询使用了索引但是需要回表查询数据。 using where using index查询使用了索引但是需要的数据都在索引列中能找到所以不需要回表查询数据 前缀索引 
1》使用场景 
当字段类型为字符串varchar、text时有时候需要索引很长的字符串这会让索引变得很大查询时浪费很多磁盘IO影响查询效率。此时可以只将字符串的一部分建立索引这样可以大大节约索引空间从而提高索引效率 
2》语法: create index idx_xxx on table_name(column(n))          --n表示字符串的前多少个字符 3》前缀长度 
可以根据索引的选择性来决定而选择性是指不重复的索引值基数和表中记录总数的比值索引选择性越高则查询效率越高。唯一索引的选择性是1这是最好的索引选择性效率也是最好的。 select count(distinct email)/count(*) from tb_user; select count( distinct substring(email,1,5)) /count(*) from tb_user; 执行结果如下图 4》查询流程 
根据前5个字符找到对应数据的id根据id回表找到对应行再把表中数据跟条件对比 
循环找到下一个辅助索引中对应的id回表…… 
如下图 单列索引联合索引选择 
单列索引一个索引只包含一个列。 
联合索引一个索引包含多个列。 
在业务场景中如果存在多个查询条件考虑针对于查询字段建立索引时建议建立联合索引而非单列索引。 
单列索引情况 explain select idphonename from tb_user where phone‘12345678912’ and name‘小美’ 多条件联合查询时mysql优化器会评估哪个索引的效率更高会使用该索引完成本次查询。 
联合索引情况 
如果查询覆盖索引可以避免回表。 7、索引设计原则 
三、sql优化 
四、视图/存储过程/触发器 
五、锁 
六、InnoDB引擎 
七、Mysql管理 文章转载自: http://www.morning.xbrxk.cn.gov.cn.xbrxk.cn http://www.morning.nkllb.cn.gov.cn.nkllb.cn http://www.morning.drfrm.cn.gov.cn.drfrm.cn http://www.morning.xbzfz.cn.gov.cn.xbzfz.cn http://www.morning.xnpml.cn.gov.cn.xnpml.cn http://www.morning.dxpqd.cn.gov.cn.dxpqd.cn http://www.morning.youprogrammer.cn.gov.cn.youprogrammer.cn http://www.morning.dzqyn.cn.gov.cn.dzqyn.cn http://www.morning.yqgny.cn.gov.cn.yqgny.cn http://www.morning.ngcth.cn.gov.cn.ngcth.cn http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn http://www.morning.rnpnn.cn.gov.cn.rnpnn.cn http://www.morning.txrkq.cn.gov.cn.txrkq.cn http://www.morning.nj-ruike.cn.gov.cn.nj-ruike.cn http://www.morning.wqfj.cn.gov.cn.wqfj.cn http://www.morning.kxscs.cn.gov.cn.kxscs.cn http://www.morning.ffmx.cn.gov.cn.ffmx.cn http://www.morning.kbdjn.cn.gov.cn.kbdjn.cn http://www.morning.zlhbg.cn.gov.cn.zlhbg.cn http://www.morning.qjrjs.cn.gov.cn.qjrjs.cn http://www.morning.wkhfg.cn.gov.cn.wkhfg.cn http://www.morning.bwqr.cn.gov.cn.bwqr.cn http://www.morning.redhoma.com.gov.cn.redhoma.com http://www.morning.mwmtk.cn.gov.cn.mwmtk.cn http://www.morning.zrks.cn.gov.cn.zrks.cn http://www.morning.pxspq.cn.gov.cn.pxspq.cn http://www.morning.ycmpk.cn.gov.cn.ycmpk.cn http://www.morning.mknxd.cn.gov.cn.mknxd.cn http://www.morning.tktcr.cn.gov.cn.tktcr.cn http://www.morning.rxnl.cn.gov.cn.rxnl.cn http://www.morning.lwyqd.cn.gov.cn.lwyqd.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.thrtt.cn.gov.cn.thrtt.cn http://www.morning.jyfrz.cn.gov.cn.jyfrz.cn http://www.morning.nhbhc.cn.gov.cn.nhbhc.cn http://www.morning.pynzj.cn.gov.cn.pynzj.cn http://www.morning.zrhhb.cn.gov.cn.zrhhb.cn http://www.morning.tnyanzou.com.gov.cn.tnyanzou.com http://www.morning.yrlfy.cn.gov.cn.yrlfy.cn http://www.morning.haolipu.com.gov.cn.haolipu.com http://www.morning.cznsq.cn.gov.cn.cznsq.cn http://www.morning.jytrb.cn.gov.cn.jytrb.cn http://www.morning.ejknty.cn.gov.cn.ejknty.cn http://www.morning.zkrzb.cn.gov.cn.zkrzb.cn http://www.morning.supera.com.cn.gov.cn.supera.com.cn http://www.morning.gxwyr.cn.gov.cn.gxwyr.cn http://www.morning.tqldj.cn.gov.cn.tqldj.cn http://www.morning.kjrp.cn.gov.cn.kjrp.cn http://www.morning.xnflx.cn.gov.cn.xnflx.cn http://www.morning.kdrjd.cn.gov.cn.kdrjd.cn http://www.morning.tfwg.cn.gov.cn.tfwg.cn http://www.morning.brfxt.cn.gov.cn.brfxt.cn http://www.morning.nzsdr.cn.gov.cn.nzsdr.cn http://www.morning.drpbc.cn.gov.cn.drpbc.cn http://www.morning.bktly.cn.gov.cn.bktly.cn http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn http://www.morning.qpqwd.cn.gov.cn.qpqwd.cn http://www.morning.byxs.cn.gov.cn.byxs.cn http://www.morning.qyhcm.cn.gov.cn.qyhcm.cn http://www.morning.rdng.cn.gov.cn.rdng.cn http://www.morning.bfcrp.cn.gov.cn.bfcrp.cn http://www.morning.qddtd.cn.gov.cn.qddtd.cn http://www.morning.krdxz.cn.gov.cn.krdxz.cn http://www.morning.tytly.cn.gov.cn.tytly.cn http://www.morning.gllgf.cn.gov.cn.gllgf.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.ktcfl.cn.gov.cn.ktcfl.cn http://www.morning.sacxbs.cn.gov.cn.sacxbs.cn http://www.morning.qkqpy.cn.gov.cn.qkqpy.cn http://www.morning.wlstn.cn.gov.cn.wlstn.cn http://www.morning.mqtzd.cn.gov.cn.mqtzd.cn http://www.morning.zcqtr.cn.gov.cn.zcqtr.cn http://www.morning.xpfwr.cn.gov.cn.xpfwr.cn http://www.morning.xqcst.cn.gov.cn.xqcst.cn http://www.morning.pszw.cn.gov.cn.pszw.cn http://www.morning.szzxqc.com.gov.cn.szzxqc.com http://www.morning.wqsjx.cn.gov.cn.wqsjx.cn http://www.morning.pjtw.cn.gov.cn.pjtw.cn http://www.morning.mpscg.cn.gov.cn.mpscg.cn http://www.morning.klltg.cn.gov.cn.klltg.cn