很是重要
)一、减小数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据能够由其余数据计算获得),注意,尽可能减小不表明彻底避免数据冗余;html
二、尽可能避免数据维护中出现更新,插入和删除异常:mysql
总结:要避免异常,须要对数据库结构进行范式化设计
。算法
三、节约数据存储空间。sql
四、提升查询效率。数据库
一、需求分析:全面了解产品设计的存储需求、数据处理需求、数据安全性与完整性;segmentfault
二、逻辑设计(重要
):设计数据的逻辑存储结构。数据实体之间的逻辑关系,解决数据冗余和数据维护异常。数据范式能够帮助咱们设计;缓存
三、物理设计:表结构设计,存储引擎与列的数据类型; 安全
四、维护优化:索引优化、存储结构优化。数据结构
传送门:数据库逻辑设计之三大范式通俗理解,一看就懂,书上说的太晦涩架构
MaxScale:实现MySQL读写分离与负载均衡的中间件利器
很是重要
)
PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) UNIQUE(惟一索引) ALTER TABLE `table_name` ADD UNIQUE (`column`) INDEX(普通索引) ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) FULLTEXT(全文索引) ALTER TABLE `table_name` ADD FULLTEXT ( `column` ) 组合索引 ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
一、索引大大减小了存储引擎须要扫描的数据量;
二、索引能够帮助咱们进行排序以免使用临时表;
三、索引能够把随机I/O变为顺序I/O。
一、索引会增长写操做的成本;
二、太多的索引会增长查询优化器的选择时间。
索引就比如一本书的目录,它会让你更快的找到内容,显然目录(索引)并非越多越好,假如这本书1000页,而有500页是目录,它固然效率低,目录是要占纸张的,而索引是要占磁盘空间的。
Innodb
索引列最大宽度为667
个字节(utf-8
差很少255
个字符),MyIsam
索引类宽度最大为1000
个字节,因而出现前缀索引,索引的选择性。
对于列的值较长,好比BLOB、TEXT、VARCHAR
,就必须创建前缀索引,即将值的前一部分做为索引。这样既能够节约空间,又能够提升查询效率。但没法使用前缀索引作 ORDER BY
和 GROUP BY
,也没法使用前缀索引作覆盖扫描。
语法: ALTER TABLE table_name ADD KEY(column_name(prefix_length))
一、常常会被使用到的列优先(选择性
差的列不适合,如性别,查询优化器可能会认为全表扫描性能更好);
二、选择性高
的列优先;
三、宽度小的列优先(一页中存储的索引越多,下降I/O
,查找越快);
若是索引了多列,要遵照最左前缀
法则。指的是查询从索引的最左前列开始而且不跳过索引中的列。
深刻理解请移步:最左前缀原理与相关优化
跟组合索引有点相似,若是索引包含全部知足查询须要的数据的索引则成为覆盖索引
(Covering Index),也就是平时所说的不须要回表操做。即索引的叶子节点上面包含了他们索引的数据(hash索引不能够)。
判断标准:使用explain
,能够经过输出的extra
列来判断,对于一个索引覆盖查询,显示为using index
,MySQL
查询优化器在执行查询前会决定是否有索引覆盖查询。
一、能够优化缓存,减小磁盘IO操做;
二、能够减小随机IO,变随机IO操做变为顺序IO操做;
三、能够避免对InnoDB主键索引的二次查询;
四、能够避免MyISAM表进行系统调用;
一、存储引擎不支持覆盖索引;
二、查询中使用了太多的列
(如SELECT *
);
三、使用了双%
号的like
查询(底层API所限制);
套路重点
)全值匹配我最爱,最左前缀要遵照;
带头大哥不能死,中间兄弟不能断;
索引列上不计算,范围以后全失效;
LIKE百分写最右,覆盖索引不写 *;
不等空值还有or,索引失效要少用;
字符单引不可丢,SQL高级也不难 ;
一、group by
实质是先排序后分组
,遵守索引的最佳左前缀。;
二、索引中全部列的方向(升序、降序)和Order By子句彻底一致;
三、当没法使用索引列,增大max_length_for_sort_data
参数的设置+增大sort_buffer_size
参数的设置;
四、若是最左列使用了范围,则排序会失效;
五、where
高于having
,能写在where
限定的条件就不要去having
去限定了
注:主键约束至关于(惟一约束 + 非空约束)
一张表中最多有一个主键约束,若是设置多个主键,就会出现以下提示:Multiple primary key defined!!!
检查工具:pt-duplicate-key-checker
扩展阅读:
MySQL索引背后的数据结构及算法原理explain 查询计划Using where:表示优化器须要经过索引回表查询数据;
Using index:表示直接访问索引就足够获取到所须要的数据,不须要经过索引回表,如覆盖索引;