MySQL Fehler erklärt

BLOB/TEXT column 'colname' used in key specification without a key length

Genauer Fehler:

ERROR 1170 (42000): BLOB/TEXT column 'colname' used in key specification without a key length"

Lösung:

Länge der Spalte reduzieren, da MySQL nur den Anfang der Spalten als Key verwenden kann.

MySQL: Insert or Update

INSERT INTO <tabelle> (spalte1, spalte2, spalte3) VALUES('a','b', 'c')
ON DUPLICATE KEY UPDATE spalte2='blah';

Siehe auch:

MySQL Full Text Search

  1. Tabelle anlegen. Diese muss als Type MyISAM haben; InnoDB funktioniert nicht
  2. Index vom Typ FULLTEXT über die Spalten anlegen, die von der Volltextsuche profitieren sollen. Wenn mehrere Spalten in einer Abfrage verwendet werden sollen, dann müssen diese in einem Index sein (also nicht pro Spalten einen Index anlegen). Sonst funktioniert die Abfrage nur über jeweils eine Spalte.
  3. Tabelle füllen.
  4. Abfrage starten:
SELECT * FROM search_index s WHERE MATCH (title, content) AGAINST ('searchphrase');

Weiterhin empfiehlt es sich, den Parameter ft_min_word_len = 3 in der my.cnf zu setzen, um eine minimale Suchwortlänge von 3 Zeichen zu haben. Danach mittels REPAIR TABLE table_name QUICK; den Index der betroffenden Tabellen neu erzeugen.

Connection Pooling mit Apache DBCP und Tomcat 6 via JNDI

1) Den passenden JDBC-Treiber und das commons-dbcp JAR in den Classpath der Anwendung legen

2) In der Apache Tomcat conf/server.xml für den Context die DataSource definieren:

<Context path= ....>
  <Resource
    name="jdbc/localhostDB"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
    username="user"
    password="pass"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/meinedatenbank?autoReconnect=true"
    maxWait="1000"
    removeAbandoned="true"
    maxActive="30"
    maxIdle="10"
    removeAbandonedTimeout="60"
    logAbandoned="true"/>

3) Die DataSource per Code verwenden:

InitialContext initCtx = new InitialContext();
Context ctx = (Context) initCtx.lookup("java:comp/env");

if (ctx == null) {
    logger.error("No InitialContext available");
} else {
    dataSource = (DataSource) ctx.lookup("jdbc/localhostDB"); // Hier den namen der DataSource aus der server/conf.xml verwenden.
}

Jetzt kommt man über dataSource.getConnection() an eine Connection.

MySQL Query cache aktivieren

In /etc/mysql/my.cnf eintragen:

query_cache_limit = 1M
query_cache_size = 18M
query_cache_type = 1 
  • query_cache_limit = max. Größe für einen einzelnen Query Aufruf, der in den Cache aufgenommen wird.
  • query_cache_size = Wie viel Speicher der gesamte Query-Cache belegen darf
  • query_cache_type = Query-Cache ein (1) der (0) ausschalten (2 per SQL aktivieren (SQL_CACHE) /deaktivieren (SQL_NO_CACHE) )

Dann in der MySQL-Konsole nachschauen ob der läuft:

SHOW STATUS LIKE 'Qcache%';

bzw.

show variables like '%cache%';