Dieser Artikel stellt hauptsächlich die MySQL-Indexnutzungsfähigkeiten und Vorsichtsmaßnahmen vor. Jetzt teile ich es mit Ihnen Seien Sie eine Referenz. Folgen wir dem Editor und werfen wir einen Blick darauf.
1 Die Rolle des Index
Allgemeine Anwendungssysteme haben ein Lese-/Schreibverhältnis von ca 10:1, und Einfügungsvorgänge und allgemeine Aktualisierungsvorgänge verursachen selten Leistungsprobleme, die auch am wahrscheinlichsten zu Problemen führen, und zwar einige komplexe Abfragevorgänge, also die Optimierung von Abfrageanweisungen offensichtlich oberste Priorität.
Wenn die Datenmenge und der Zugriff gering sind, ist der MySQL-Zugriff sehr schnell und die Frage, ob Indizes hinzugefügt werden sollen oder nicht, hat kaum Auswirkungen auf den Zugriff. Wenn jedoch die Datenmenge und der Zugriff dramatisch zunehmen, werden Sie feststellen, dass MySQL langsamer wird oder sogar ausfällt. In diesem Fall müssen Sie über die Optimierung von SQL nachdenken. Das Erstellen eines korrekten und angemessenen Index für die Datenbank ist ein wichtiges Mittel zur MySQL-Optimierung.
Der Zweck des Index besteht darin, die Abfrageeffizienz zu verbessern, was mit einem Wörterbuch verglichen werden kann. Wenn wir das Wort „MySQL“ nachschlagen möchten, müssen wir unbedingt den Buchstaben „m“ und dann das „y“ finden Schreiben Sie den Buchstaben von unten nach unten und suchen Sie dann den verbleibenden SQL-Code. Ohne einen Index müssen Sie möglicherweise alle Wörter durchsehen, um das Gesuchte zu finden. Neben Wörterbüchern sind überall im Leben Beispiele für Verzeichnisse zu sehen, etwa Zugfahrpläne an Bahnhöfen, Buchkataloge usw. Ihre Prinzipien sind die gleichen. Indem Sie den Umfang der Daten, die Sie erhalten möchten, ständig einschränken, können Sie die gewünschten Endergebnisse herausfiltern und gleichzeitig zufällige Ereignisse in sequentielle Ereignisse umwandeln, d. h. wir verwenden immer die gleiche Suche Methode zum Sperren von Daten.
Beim Erstellen eines Index müssen Sie berücksichtigen, welche Spalten in SQL-Abfragen verwendet werden, und dann einen oder mehrere Indizes für diese Spalten erstellen. Tatsächlich ist ein Index auch eine Tabelle, die den Primärschlüssel oder das Indexfeld enthält, sowie einen Zeiger, der jeden Datensatz auf die tatsächliche Tabelle verweist. Indizes sind für Datenbankbenutzer nicht sichtbar; sie dienen lediglich der Beschleunigung von Abfragen. Datenbanksuchmaschinen verwenden Indizes, um Datensätze schnell zu finden.
INSERT- und UPDATE-Anweisungen benötigen mehr Zeit für die Ausführung von Tabellen mit Indizes, SELECT-Anweisungen werden jedoch schneller ausgeführt. Dies liegt daran, dass die Datenbank bei einer Einfügung oder Aktualisierung auch den Indexwert einfügen oder aktualisieren muss.
2. Indexerstellung und -löschung
Indextyp:
UNIQUE (nur Index ): Derselbe Wert kann nicht erscheinen, es kann ein NULL-Wert sein
INDEX (normaler Index): Derselbe Indexinhalt darf
(1) Verwenden Sie die ALTER TABLE-Anweisung, um einfach
zu erstellen und fügen Sie es dann hinzu, nachdem die Tabelle erstellt wurde.ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)
//普通索引 alter table table_name add index index_name (column_list) ; //唯一索引 alter table table_name add unique (column_list) ; //主键索引 alter table table_name add primary key (column_list) ;
(2) Verwenden Sie die CREATE INDEX-Anweisung, um der Tabelle Indizes hinzuzufügen.
CREATE INDEX kann verwendet werden, um der Tabelle gewöhnliche Indizes oder UNIQUE-Indizes hinzuzufügen kann zum Erstellen von Indizes beim Erstellen von Tabellen verwendet werden.CREATE INDEX index_name ON table_name(username(length));
//create只能添加这两种索引; CREATE INDEX index_name ON table_name (column_list) CREATE UNIQUE INDEX index_name ON table_name (column_list)
(3) Index löschen
Das Löschen des Index kann mit der ALTER TABLE- oder DROP INDEX-Anweisung erfolgen. DROP INDEX kann als Anweisung in ALTER TABLE verarbeitet werden und hat das folgende Format:drop index index_name on table_name ; alter table table_name drop index index_name ; alter table table_name drop primary key ;
(4) Kombinationsindex und Präfixindex
在这里要指出,组合索引和前缀索引是对建立索引技巧的一种称呼,并不是索引的类型。为了更好的表述清楚,建立一个demo表如下。
create table USER_DEMO ( ID int not null auto_increment comment '主键', LOGIN_NAME varchar(100) not null comment '登录名', PASSWORD varchar(100) not null comment '密码', CITY varchar(30) not null comment '城市', AGE int not null comment '年龄', SEX int not null comment '性别(0:女 1:男)', primary key (ID) );
为了进一步榨取mysql的效率,就可以考虑建立组合索引,即将LOGIN_NAME,CITY,AGE建到一个索引里:
代码如下:
ALTER TABLE USER_DEMO ADD INDEX name_city_age (LOGIN_NAME(16),CITY,AGE);
建表时,LOGIN_NAME长度为100,这里用16,是因为一般情况下名字的长度不会超过16,这样会加快索引查询速度,还会减少索引文件的大小,提高INSERT,UPDATE的更新速度。
如果分别给LOGIN_NAME,CITY,AGE建立单列索引,让该表有3个单列索引,查询时和组合索引的效率是大不一样的,甚至远远低于我们的组合索引。虽然此时有三个索引,但mysql只能用到其中的那个它认为似乎是最有效率的单列索引,另外两个是用不到的,也就是说还是一个全表扫描的过程。
建立这样的组合索引,就相当于分别建立如下三种组合索引:
LOGIN_NAME,CITY,AGE LOGIN_NAME,CITY LOGIN_NAME
为什么没有CITY,AGE等这样的组合索引呢?这是因为mysql组合索引“最左前缀”的结果。简单的理解就是只从最左边的开始组合,并不是只要包含这三列的查询都会用到该组合索引。也就是说name_city_age(LOGIN_NAME(16),CITY,AGE)从左到右进行索引,如果没有左前索引,mysql不会执行索引查询。
如果索引列长度过长,这种列索引时将会产生很大的索引文件,不便于操作,可以使用前缀索引方式进行索引,前缀索引应该控制在一个合适的点,控制在0.31黄金值即可(大于这个值就可以创建)。
SELECT COUNT(DISTINCT(LEFT(`title`,10)))/COUNT(*) FROM Arctic; -- 这个值大于0.31就可以创建前缀索引,Distinct去重复 ALTER TABLE `user` ADD INDEX `uname`(title(10)); -- 增加前缀索引SQL,将人名的索引建立在10,这样可以减少索引文件大小,加快索引查询速度
三.索引的使用及注意事项
EXPLAIN可以帮助开发人员分析SQL问题,explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。
使用方法,在select语句前加上Explain就可以了:
Explain select * from user where id=1;
尽量避免这些不走索引的sql:
SELECT `sname` FROM `stu` WHERE `age`+10=30;-- 不会使用索引,因为所有索引列参与了计算 SELECT `sname` FROM `stu` WHERE LEFT(`date`,4) <1990; -- 不会使用索引,因为使用了函数运算,原理与上面相同 SELECT * FROM `houdunwang` WHERE `uname` LIKE'后盾%' -- 走索引 SELECT * FROM `houdunwang` WHERE `uname` LIKE "%后盾%" -- 不走索引 -- 正则表达式不使用索引,这应该很好理解,所以为什么在SQL中很难看到regexp关键字的原因 -- 字符串与数字比较不使用索引; CREATE TABLE `a` (`a` char(10)); EXPLAIN SELECT * FROM `a` WHERE `a`="1" -- 走索引 EXPLAIN SELECT * FROM `a` WHERE `a`=1 -- 不走索引 select * from dept where dname='xxx' or loc='xx' or deptno=45 --如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or 关键字
-- 如果mysql估计使用全表扫描要比使用索引快,则不使用索引
索引虽然好处很多,但过多的使用索引可能带来相反的问题,索引也是有缺点的:
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT,UPDATE和DELETE。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件
建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在要给大表上建了多种组合索引,索引文件会膨胀很宽
索引只是提高效率的一个方式,如果mysql有大数据量的表,就要花时间研究建立最优的索引,或优化查询语句。
使用索引时,有一些技巧:
1.索引不会包含有NULL的列
只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。
2.使用短索引
对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。
4.like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%'不会使用索引,而like ‘aaa%'可以使用索引。
5.不要在列上进行运算
6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
7.索引要建立在经常进行select操作的字段上。
这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
8.索引要建立在值比较唯一的字段上。
9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。
10.在where和join中出现的列需要建立索引。
11. Wenn in der Abfragebedingung von where ein Ungleichheitszeichen (Where-Spalte != ...) vorhanden ist, kann MySQL den Index nicht verwenden.
12. Wenn eine Funktion in der Abfragebedingung der where-Klausel verwendet wird (z. B. where DAY (column) =...), kann MySQL den Index nicht verwenden.
13. Bei der Join-Operation (wenn Daten aus mehreren Datentabellen extrahiert werden müssen) kann MySQL den Index nur verwenden, wenn der Datentyp des Primärschlüssels und des Fremdschlüssels gleich ist, andernfalls der Index wird nicht verwendet, wenn sie rechtzeitig festgestellt wird.
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Tipps und Vorsichtsmaßnahmen zur Verwendung des MySQL-Index. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!